xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric #include "AVRELFStreamer.h"
20b57cec5SDimitry Andric 
30b57cec5SDimitry Andric #include "llvm/BinaryFormat/ELF.h"
481ad6265SDimitry Andric #include "llvm/MC/MCAssembler.h"
50b57cec5SDimitry Andric #include "llvm/MC/MCSubtargetInfo.h"
60b57cec5SDimitry Andric #include "llvm/Support/FormattedStream.h"
706c3fb27SDimitry Andric #include "llvm/TargetParser/SubtargetFeature.h"
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "AVRMCTargetDesc.h"
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric namespace llvm {
120b57cec5SDimitry Andric 
130b57cec5SDimitry Andric static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) {
140b57cec5SDimitry Andric   unsigned EFlags = 0;
150b57cec5SDimitry Andric 
160b57cec5SDimitry Andric   // Set architecture
170b57cec5SDimitry Andric   if (Features[AVR::ELFArchAVR1])
180b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR1;
190b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR2])
200b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR2;
210b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR25])
220b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR25;
230b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR3])
240b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR3;
250b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR31])
260b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR31;
270b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR35])
280b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR35;
290b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR4])
300b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR4;
310b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR5])
320b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR5;
330b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR51])
340b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR51;
350b57cec5SDimitry Andric   else if (Features[AVR::ELFArchAVR6])
360b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVR6;
370b57cec5SDimitry Andric   else if (Features[AVR::ELFArchTiny])
380b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_AVRTINY;
390b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA1])
400b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA1;
410b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA2])
420b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA2;
430b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA3])
440b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA3;
450b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA4])
460b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA4;
470b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA5])
480b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA5;
490b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA6])
500b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA6;
510b57cec5SDimitry Andric   else if (Features[AVR::ELFArchXMEGA7])
520b57cec5SDimitry Andric     EFlags |= ELF::EF_AVR_ARCH_XMEGA7;
530b57cec5SDimitry Andric 
540b57cec5SDimitry Andric   return EFlags;
550b57cec5SDimitry Andric }
560b57cec5SDimitry Andric 
57349cc55cSDimitry Andric AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
580b57cec5SDimitry Andric     : AVRTargetStreamer(S) {
59*0fca6ea1SDimitry Andric   ELFObjectWriter &W = getStreamer().getWriter();
60*0fca6ea1SDimitry Andric   unsigned EFlags = W.getELFHeaderEFlags();
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric   EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits());
6306c3fb27SDimitry Andric   EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;
640b57cec5SDimitry Andric 
65*0fca6ea1SDimitry Andric   W.setELFHeaderEFlags(EFlags);
660b57cec5SDimitry Andric }
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric } // end namespace llvm
69