xref: /llvm-project/llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp (revision ed8019d9fbed2e6a6b08f8f73e9fa54a24f3ed52)
1 #include "AVRELFStreamer.h"
2 #include "AVRMCTargetDesc.h"
3 #include "llvm/BinaryFormat/ELF.h"
4 #include "llvm/MC/MCELFObjectWriter.h"
5 #include "llvm/MC/MCSubtargetInfo.h"
6 #include "llvm/TargetParser/SubtargetFeature.h"
7 
8 namespace llvm {
9 
10 static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) {
11   unsigned EFlags = 0;
12 
13   // Set architecture
14   if (Features[AVR::ELFArchAVR1])
15     EFlags |= ELF::EF_AVR_ARCH_AVR1;
16   else if (Features[AVR::ELFArchAVR2])
17     EFlags |= ELF::EF_AVR_ARCH_AVR2;
18   else if (Features[AVR::ELFArchAVR25])
19     EFlags |= ELF::EF_AVR_ARCH_AVR25;
20   else if (Features[AVR::ELFArchAVR3])
21     EFlags |= ELF::EF_AVR_ARCH_AVR3;
22   else if (Features[AVR::ELFArchAVR31])
23     EFlags |= ELF::EF_AVR_ARCH_AVR31;
24   else if (Features[AVR::ELFArchAVR35])
25     EFlags |= ELF::EF_AVR_ARCH_AVR35;
26   else if (Features[AVR::ELFArchAVR4])
27     EFlags |= ELF::EF_AVR_ARCH_AVR4;
28   else if (Features[AVR::ELFArchAVR5])
29     EFlags |= ELF::EF_AVR_ARCH_AVR5;
30   else if (Features[AVR::ELFArchAVR51])
31     EFlags |= ELF::EF_AVR_ARCH_AVR51;
32   else if (Features[AVR::ELFArchAVR6])
33     EFlags |= ELF::EF_AVR_ARCH_AVR6;
34   else if (Features[AVR::ELFArchTiny])
35     EFlags |= ELF::EF_AVR_ARCH_AVRTINY;
36   else if (Features[AVR::ELFArchXMEGA1])
37     EFlags |= ELF::EF_AVR_ARCH_XMEGA1;
38   else if (Features[AVR::ELFArchXMEGA2])
39     EFlags |= ELF::EF_AVR_ARCH_XMEGA2;
40   else if (Features[AVR::ELFArchXMEGA3])
41     EFlags |= ELF::EF_AVR_ARCH_XMEGA3;
42   else if (Features[AVR::ELFArchXMEGA4])
43     EFlags |= ELF::EF_AVR_ARCH_XMEGA4;
44   else if (Features[AVR::ELFArchXMEGA5])
45     EFlags |= ELF::EF_AVR_ARCH_XMEGA5;
46   else if (Features[AVR::ELFArchXMEGA6])
47     EFlags |= ELF::EF_AVR_ARCH_XMEGA6;
48   else if (Features[AVR::ELFArchXMEGA7])
49     EFlags |= ELF::EF_AVR_ARCH_XMEGA7;
50 
51   return EFlags;
52 }
53 
54 AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
55     : AVRTargetStreamer(S) {
56   ELFObjectWriter &W = getStreamer().getWriter();
57   unsigned EFlags = W.getELFHeaderEFlags();
58 
59   EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits());
60   EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;
61 
62   W.setELFHeaderEFlags(EFlags);
63 }
64 
65 } // end namespace llvm
66