diff options
Diffstat (limited to 'lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp')
-rw-r--r-- | lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp b/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp new file mode 100644 index 000000000000..481de320b22f --- /dev/null +++ b/lib/Target/AVR/MCTargetDesc/AVRELFStreamer.cpp @@ -0,0 +1,66 @@ +#include "AVRELFStreamer.h" + +#include "llvm/Support/ELF.h" +#include "llvm/Support/FormattedStream.h" + +#include "AVRMCTargetDesc.h" + +namespace llvm { + +static unsigned getEFlagsForFeatureSet(const FeatureBitset &Features) { + unsigned EFlags = 0; + + // Set architecture + if (Features[AVR::ELFArchAVR1]) + EFlags |= ELF::EF_AVR_ARCH_AVR1; + else if (Features[AVR::ELFArchAVR2]) + EFlags |= ELF::EF_AVR_ARCH_AVR2; + else if (Features[AVR::ELFArchAVR25]) + EFlags |= ELF::EF_AVR_ARCH_AVR25; + else if (Features[AVR::ELFArchAVR3]) + EFlags |= ELF::EF_AVR_ARCH_AVR3; + else if (Features[AVR::ELFArchAVR31]) + EFlags |= ELF::EF_AVR_ARCH_AVR31; + else if (Features[AVR::ELFArchAVR35]) + EFlags |= ELF::EF_AVR_ARCH_AVR35; + else if (Features[AVR::ELFArchAVR4]) + EFlags |= ELF::EF_AVR_ARCH_AVR4; + else if (Features[AVR::ELFArchAVR5]) + EFlags |= ELF::EF_AVR_ARCH_AVR5; + else if (Features[AVR::ELFArchAVR51]) + EFlags |= ELF::EF_AVR_ARCH_AVR51; + else if (Features[AVR::ELFArchAVR6]) + EFlags |= ELF::EF_AVR_ARCH_AVR6; + else if (Features[AVR::ELFArchAVRTiny]) + EFlags |= ELF::EF_AVR_ARCH_AVRTINY; + else if (Features[AVR::ELFArchXMEGA1]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA1; + else if (Features[AVR::ELFArchXMEGA2]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA2; + else if (Features[AVR::ELFArchXMEGA3]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA3; + else if (Features[AVR::ELFArchXMEGA4]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA4; + else if (Features[AVR::ELFArchXMEGA5]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA5; + else if (Features[AVR::ELFArchXMEGA6]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA6; + else if (Features[AVR::ELFArchXMEGA7]) + EFlags |= ELF::EF_AVR_ARCH_XMEGA7; + + return EFlags; +} + +AVRELFStreamer::AVRELFStreamer(MCStreamer &S, + const MCSubtargetInfo &STI) + : AVRTargetStreamer(S) { + + MCAssembler &MCA = getStreamer().getAssembler(); + unsigned EFlags = MCA.getELFHeaderEFlags(); + + EFlags |= getEFlagsForFeatureSet(STI.getFeatureBits()); + + MCA.setELFHeaderEFlags(EFlags); +} + +} // end namespace llvm |