| //===-- 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/MCContext.h" | |
| #include "llvm/MC/MCELFStreamer.h" | |
| #include "llvm/MC/MCSectionELF.h" | |
| #include "llvm/MC/MCStreamer.h" | |
| #include "llvm/MC/MCSubtargetInfo.h" | |
| using namespace llvm; | |
| 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.EmitIntValue(0x41, 1); | |
| // Subsection length. | |
| Streamer.EmitIntValue(22, 4); | |
| // Vendor name string, zero-terminated. | |
| Streamer.EmitBytes("mspabi"); | |
| Streamer.EmitIntValue(0, 1); | |
| // Attribute vector scope tag. 1 stands for the entire file. | |
| Streamer.EmitIntValue(1, 1); | |
| // Attribute vector length. | |
| Streamer.EmitIntValue(11, 4); | |
| // OFBA_MSPABI_Tag_ISA(4) = 1, MSP430 | |
| Streamer.EmitIntValue(4, 1); | |
| Streamer.EmitIntValue(1, 1); | |
| // OFBA_MSPABI_Tag_Code_Model(6) = 1, Small | |
| Streamer.EmitIntValue(6, 1); | |
| Streamer.EmitIntValue(1, 1); | |
| // OFBA_MSPABI_Tag_Data_Model(8) = 1, Small | |
| Streamer.EmitIntValue(8, 1); | |
| Streamer.EmitIntValue(1, 1); | |
| } | |
| MCELFStreamer &MSP430TargetELFStreamer::getStreamer() { | |
| return static_cast<MCELFStreamer &>(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 |