66 lines · cpp
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 architecture14 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(STI.getFeatureBits());60 EFlags |= ELF::EF_AVR_LINKRELAX_PREPARED;61 62 W.setELFHeaderEFlags(EFlags);63}64 65} // end namespace llvm66