brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 6c7922a Raw
79 lines · cpp
1//===-- MSP430ELFStreamer.cpp - MSP430 ELF Target Streamer Methods --------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// This file provides MSP430 specific target streamer methods.10//11//===----------------------------------------------------------------------===//12 13#include "MSP430MCTargetDesc.h"14#include "llvm/BinaryFormat/ELF.h"15#include "llvm/MC/MCAssembler.h"16#include "llvm/MC/MCContext.h"17#include "llvm/MC/MCELFStreamer.h"18#include "llvm/MC/MCSectionELF.h"19#include "llvm/MC/MCStreamer.h"20#include "llvm/MC/MCSubtargetInfo.h"21#include "llvm/Support/MSP430Attributes.h"22 23using namespace llvm;24using namespace llvm::MSP430Attrs;25 26namespace llvm {27 28class MSP430TargetELFStreamer : public MCTargetStreamer {29public:30  MCELFStreamer &getStreamer();31  MSP430TargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);32};33 34// This part is for ELF object output.35MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S,36                                                 const MCSubtargetInfo &STI)37    : MCTargetStreamer(S) {38  // Emit build attributes section according to39  // MSP430 EABI (slaa534.pdf, part 13).40  MCSection *AttributeSection = getStreamer().getContext().getELFSection(41      ".MSP430.attributes", ELF::SHT_MSP430_ATTRIBUTES, 0);42  Streamer.switchSection(AttributeSection);43 44  // Format version.45  Streamer.emitInt8(0x41);46  // Subsection length.47  Streamer.emitInt32(22);48  // Vendor name string, zero-terminated.49  Streamer.emitBytes("mspabi");50  Streamer.emitInt8(0);51 52  // Attribute vector scope tag. 1 stands for the entire file.53  Streamer.emitInt8(1);54  // Attribute vector length.55  Streamer.emitInt32(11);56 57  Streamer.emitInt8(TagISA);58  Streamer.emitInt8(STI.hasFeature(MSP430::FeatureX) ? ISAMSP430X : ISAMSP430);59  Streamer.emitInt8(TagCodeModel);60  Streamer.emitInt8(CMSmall);61  Streamer.emitInt8(TagDataModel);62  Streamer.emitInt8(DMSmall);63  // Don't emit TagEnumSize, for full GCC compatibility.64}65 66MCELFStreamer &MSP430TargetELFStreamer::getStreamer() {67  return static_cast<MCELFStreamer &>(Streamer);68}69 70MCTargetStreamer *71createMSP430ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {72  const Triple &TT = STI.getTargetTriple();73  if (TT.isOSBinFormatELF())74    return new MSP430TargetELFStreamer(S, STI);75  return nullptr;76}77 78} // namespace llvm79