| //===-- 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" |
| #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<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 |