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 McKaystatic 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 GuptaAVRELFStreamer::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