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