17ec6f560SDylan McKay #include "AVRELFStreamer.h"
27ec6f560SDylan McKay 
3264b5d9eSZachary Turner #include "llvm/BinaryFormat/ELF.h"
4*ef736a1cSserge-sans-paille #include "llvm/MC/MCAssembler.h"
52e35987dSDylan McKay #include "llvm/MC/MCSubtargetInfo.h"
62e35987dSDylan McKay #include "llvm/MC/SubtargetFeature.h"
77ec6f560SDylan McKay #include "llvm/Support/FormattedStream.h"
87ec6f560SDylan McKay 
928ae3173SDylan McKay #include "AVRMCTargetDesc.h"
1028ae3173SDylan McKay 
1128ae3173SDylan McKay namespace llvm {
1228ae3173SDylan McKay 
getEFlagsForFeatureSet(const FeatureBitset & Features)137ec6f560SDylan McKay static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) {
147ec6f560SDylan McKay   unsigned EFlags = 0;
157ec6f560SDylan McKay 
167ec6f560SDylan McKay   // Set architecture
177ec6f560SDylan McKay   if (Features[AVR::ELFArchAVR1])
187ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR1;
197ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR2])
207ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR2;
217ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR25])
227ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR25;
237ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR3])
247ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR3;
257ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR31])
267ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR31;
277ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR35])
287ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR35;
297ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR4])
307ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR4;
317ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR5])
327ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR5;
337ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR51])
347ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR51;
357ec6f560SDylan McKay   else if (Features[AVR::ELFArchAVR6])
367ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVR6;
3796fdc65dSDylan McKay   else if (Features[AVR::ELFArchTiny])
387ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_AVRTINY;
397ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA1])
407ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA1;
417ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA2])
427ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA2;
437ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA3])
447ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA3;
457ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA4])
467ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA4;
477ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA5])
487ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA5;
497ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA6])
507ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA6;
517ec6f560SDylan McKay   else if (Features[AVR::ELFArchXMEGA7])
527ec6f560SDylan McKay     EFlags |= ELF::EF_AVR_ARCH_XMEGA7;
537ec6f560SDylan McKay 
547ec6f560SDylan McKay   return EFlags;
557ec6f560SDylan McKay }
567ec6f560SDylan McKay 
AVRELFStreamer(MCStreamer & S,const MCSubtargetInfo & STI)575449d2daSShivam Gupta AVRELFStreamer::AVRELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI)
587ec6f560SDylan McKay     : AVRTargetStreamer(S) {
597ec6f560SDylan McKay 
607ec6f560SDylan McKay   MCAssembler &MCA = getStreamer().getAssembler();
6128ae3173SDylan McKay   unsigned EFlags = MCA.getELFHeaderEFlags();
627ec6f560SDylan McKay 
6328ae3173SDylan McKay   EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits());
647ec6f560SDylan McKay 
657ec6f560SDylan McKay   MCA.setELFHeaderEFlags(EFlags);
667ec6f560SDylan McKay }
6728ae3173SDylan McKay 
6828ae3173SDylan McKay } // end namespace llvm
69