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-exception 6 // 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 23 using namespace llvm; 24 using namespace llvm::MSP430Attrs; 25 26 namespace llvm { 27 28 class MSP430TargetELFStreamer : public MCTargetStreamer { 29 public: 30 MCELFStreamer &getStreamer(); 31 MSP430TargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI); 32 }; 33 34 // This part is for ELF object output. 35 MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S, 36 const MCSubtargetInfo &STI) 37 : MCTargetStreamer(S) { 38 // Emit build attributes section according to 39 // 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 66 MCELFStreamer &MSP430TargetELFStreamer::getStreamer() { 67 return static_cast<MCELFStreamer &>(Streamer); 68 } 69 70 MCTargetStreamer * 71 createMSP430ObjectTargetStreamer(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 llvm 79