1*b5893f02SDimitry Andric //===-- MSP430ELFStreamer.cpp - MSP430 ELF Target Streamer Methods --------===//
2*b5893f02SDimitry Andric //
3*b5893f02SDimitry Andric // The LLVM Compiler Infrastructure
4*b5893f02SDimitry Andric //
5*b5893f02SDimitry Andric // This file is distributed under the University of Illinois Open Source
6*b5893f02SDimitry Andric // License. See LICENSE.TXT for details.
7*b5893f02SDimitry Andric //
8*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
9*b5893f02SDimitry Andric //
10*b5893f02SDimitry Andric // This file provides MSP430 specific target streamer methods.
11*b5893f02SDimitry Andric //
12*b5893f02SDimitry Andric //===----------------------------------------------------------------------===//
13*b5893f02SDimitry Andric
14*b5893f02SDimitry Andric #include "MSP430MCTargetDesc.h"
15*b5893f02SDimitry Andric #include "llvm/BinaryFormat/ELF.h"
16*b5893f02SDimitry Andric #include "llvm/MC/MCContext.h"
17*b5893f02SDimitry Andric #include "llvm/MC/MCELFStreamer.h"
18*b5893f02SDimitry Andric #include "llvm/MC/MCSectionELF.h"
19*b5893f02SDimitry Andric #include "llvm/MC/MCStreamer.h"
20*b5893f02SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h"
21*b5893f02SDimitry Andric
22*b5893f02SDimitry Andric using namespace llvm;
23*b5893f02SDimitry Andric
24*b5893f02SDimitry Andric namespace llvm {
25*b5893f02SDimitry Andric
26*b5893f02SDimitry Andric class MSP430TargetELFStreamer : public MCTargetStreamer {
27*b5893f02SDimitry Andric public:
28*b5893f02SDimitry Andric MCELFStreamer &getStreamer();
29*b5893f02SDimitry Andric MSP430TargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
30*b5893f02SDimitry Andric };
31*b5893f02SDimitry Andric
32*b5893f02SDimitry Andric // This part is for ELF object output.
MSP430TargetELFStreamer(MCStreamer & S,const MCSubtargetInfo & STI)33*b5893f02SDimitry Andric MSP430TargetELFStreamer::MSP430TargetELFStreamer(MCStreamer &S,
34*b5893f02SDimitry Andric const MCSubtargetInfo &STI)
35*b5893f02SDimitry Andric : MCTargetStreamer(S) {
36*b5893f02SDimitry Andric MCAssembler &MCA = getStreamer().getAssembler();
37*b5893f02SDimitry Andric unsigned EFlags = MCA.getELFHeaderEFlags();
38*b5893f02SDimitry Andric MCA.setELFHeaderEFlags(EFlags);
39*b5893f02SDimitry Andric
40*b5893f02SDimitry Andric // Emit build attributes section according to
41*b5893f02SDimitry Andric // MSP430 EABI (slaa534.pdf, part 13).
42*b5893f02SDimitry Andric MCSection *AttributeSection = getStreamer().getContext().getELFSection(
43*b5893f02SDimitry Andric ".MSP430.attributes", ELF::SHT_MSP430_ATTRIBUTES, 0);
44*b5893f02SDimitry Andric Streamer.SwitchSection(AttributeSection);
45*b5893f02SDimitry Andric
46*b5893f02SDimitry Andric // Format version.
47*b5893f02SDimitry Andric Streamer.EmitIntValue(0x41, 1);
48*b5893f02SDimitry Andric // Subsection length.
49*b5893f02SDimitry Andric Streamer.EmitIntValue(22, 4);
50*b5893f02SDimitry Andric // Vendor name string, zero-terminated.
51*b5893f02SDimitry Andric Streamer.EmitBytes("mspabi");
52*b5893f02SDimitry Andric Streamer.EmitIntValue(0, 1);
53*b5893f02SDimitry Andric
54*b5893f02SDimitry Andric // Attribute vector scope tag. 1 stands for the entire file.
55*b5893f02SDimitry Andric Streamer.EmitIntValue(1, 1);
56*b5893f02SDimitry Andric // Attribute vector length.
57*b5893f02SDimitry Andric Streamer.EmitIntValue(11, 4);
58*b5893f02SDimitry Andric // OFBA_MSPABI_Tag_ISA(4) = 1, MSP430
59*b5893f02SDimitry Andric Streamer.EmitIntValue(4, 1);
60*b5893f02SDimitry Andric Streamer.EmitIntValue(1, 1);
61*b5893f02SDimitry Andric // OFBA_MSPABI_Tag_Code_Model(6) = 1, Small
62*b5893f02SDimitry Andric Streamer.EmitIntValue(6, 1);
63*b5893f02SDimitry Andric Streamer.EmitIntValue(1, 1);
64*b5893f02SDimitry Andric // OFBA_MSPABI_Tag_Data_Model(8) = 1, Small
65*b5893f02SDimitry Andric Streamer.EmitIntValue(8, 1);
66*b5893f02SDimitry Andric Streamer.EmitIntValue(1, 1);
67*b5893f02SDimitry Andric }
68*b5893f02SDimitry Andric
getStreamer()69*b5893f02SDimitry Andric MCELFStreamer &MSP430TargetELFStreamer::getStreamer() {
70*b5893f02SDimitry Andric return static_cast<MCELFStreamer &>(Streamer);
71*b5893f02SDimitry Andric }
72*b5893f02SDimitry Andric
73*b5893f02SDimitry Andric MCTargetStreamer *
createMSP430ObjectTargetStreamer(MCStreamer & S,const MCSubtargetInfo & STI)74*b5893f02SDimitry Andric createMSP430ObjectTargetStreamer(MCStreamer &S, const MCSubtargetInfo &STI) {
75*b5893f02SDimitry Andric const Triple &TT = STI.getTargetTriple();
76*b5893f02SDimitry Andric if (TT.isOSBinFormatELF())
77*b5893f02SDimitry Andric return new MSP430TargetELFStreamer(S, STI);
78*b5893f02SDimitry Andric return nullptr;
79*b5893f02SDimitry Andric }
80*b5893f02SDimitry Andric
81*b5893f02SDimitry Andric } // namespace llvm
82