//===-- MSP430ELFStreamer.cpp - MSP430 ELF Target Streamer Methods --------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file provides MSP430 specific target streamer methods. // //===----------------------------------------------------------------------===// #include "MSP430MCTargetDesc.h" #include "llvm/BinaryFormat/ELF.h" #include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCELFStreamer.h" #include "llvm/MC/MCSectionELF.h" #include "llvm/MC/MCStreamer.h" #include "llvm/MC/MCSubtargetInfo.h" #include "llvm/Support/MSP430Attributes.h" using namespace llvm; using namespace llvm::MSP430Attrs; namespace llvm { class MSP430TargetELFStreamer : public MCTargetStreamer { public: MCELFStreamer &getStreamer(); MSP430TargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); }; // This part is for ELF object output. MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI) : MCTargetStreamer(S) { MCAssembler &MCA = getStreamer().getAssembler(); unsigned EFlags = MCA.getELFHeaderEFlags(); MCA.setELFHeaderEFlags(EFlags); // Emit build attributes section according to // MSP430 EABI (slaa534.pdf, part 13). MCSection *AttributeSection = getStreamer().getContext().getELFSection( ".MSP430.attributes", ELF::SHT_MSP430_ATTRIBUTES, 0); Streamer.switchSection(AttributeSection); // Format version. Streamer.emitInt8(0x41); // Subsection length. Streamer.emitInt32(22); // Vendor name string, zero-terminated. Streamer.emitBytes("mspabi"); Streamer.emitInt8(0); // Attribute vector scope tag. 1 stands for the entire file. Streamer.emitInt8(1); // Attribute vector length. Streamer.emitInt32(11); Streamer.emitInt8(TagISA); Streamer.emitInt8(STI.hasFeature(MSP430::FeatureX) ? ISAMSP430X : ISAMSP430); Streamer.emitInt8(TagCodeModel); Streamer.emitInt8(CMSmall); Streamer.emitInt8(TagDataModel); Streamer.emitInt8(DMSmall); // Don't emit TagEnumSize, for full GCC compatibility. } MCELFStreamer &MSP430TargetELFStreamer::getStreamer() { return static_cast(Streamer); } MCTargetStreamer * createMSP430ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) { const Triple &TT = STI.getTargetTriple(); if (TT.isOSBinFormatELF()) return new MSP430TargetELFStreamer(S, STI); return nullptr; } } // namespace llvm