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