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
8namespace llvm {
9
10static 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
54AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
55 : AVRTargetStreamer(S) {
56 ELFObjectWriter &W = getStreamer().getWriter();
57 unsigned EFlags = W.getELFHeaderEFlags();
58
59 EFlags |= getEFlagsForFeatureSet(Features: STI.getFeatureBits());
60 EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;
61
62 W.setELFHeaderEFlags(EFlags);
63}
64
65} // end namespace llvm
66