diff options
author | Jason W Kim <jason.w.kim.2009@gmail.com> | 2010-10-11 23:01:44 +0000 |
---|---|---|
committer | Jason W Kim <jason.w.kim.2009@gmail.com> | 2010-10-11 23:01:44 +0000 |
commit | 17b443df4368acfad853d09858c033c45c468d5c (patch) | |
tree | 23eaf6defe5ca1239c1bcf27f904156ee70a9bb0 | |
parent | d3d2ddc78ea901a5b11123374f50523ea86428cb (diff) |
Second set of ARM/MC/ELF changes.
Added ARM specific ELF section types.
Added AttributesSection to ARMElfTargetObject
First step in unifying .cpu assembly tag with ELF/.o
llc now asserts on actual ELF emission on -filetype=obj :-)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@116257 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/MC/MCSectionELF.h | 13 | ||||
-rw-r--r-- | lib/Target/ARM/ARMAsmPrinter.cpp | 48 | ||||
-rw-r--r-- | lib/Target/ARM/ARMBuildAttrs.h | 12 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetObjectFile.cpp | 6 | ||||
-rw-r--r-- | lib/Target/ARM/ARMTargetObjectFile.h | 11 |
5 files changed, 83 insertions, 7 deletions
diff --git a/include/llvm/MC/MCSectionELF.h b/include/llvm/MC/MCSectionELF.h index fdccdfdc66..0e4a286e72 100644 --- a/include/llvm/MC/MCSectionELF.h +++ b/include/llvm/MC/MCSectionELF.h @@ -121,7 +121,18 @@ public: // referenced symbol table contain the escape value SHN_XINDEX SHT_SYMTAB_SHNDX = 0x12U, - LAST_KNOWN_SECTION_TYPE = SHT_SYMTAB_SHNDX + // Start of target-specific flags. + + // Exception Index table + SHT_ARM_EXIDX = 0x70000001U, + // BPABI DLL dynamic linking pre-emption map + SHT_ARM_PREEMPTMAP = 0x70000002U, + // Object file compatibility attributes + SHT_ARM_ATTRIBUTES = 0x70000003U, + SHT_ARM_DEBUGOVERLAY = 0x70000004U, + SHT_ARM_OVERLAYSECTION = 0x70000005U, + + LAST_KNOWN_SECTION_TYPE = SHT_ARM_OVERLAYSECTION }; /// Valid section flags. diff --git a/lib/Target/ARM/ARMAsmPrinter.cpp b/lib/Target/ARM/ARMAsmPrinter.cpp index 7951cfabb8..dab549110d 100644 --- a/lib/Target/ARM/ARMAsmPrinter.cpp +++ b/lib/Target/ARM/ARMAsmPrinter.cpp @@ -21,6 +21,7 @@ #include "ARMMachineFunctionInfo.h" #include "ARMMCInstLower.h" #include "ARMTargetMachine.h" +#include "ARMTargetObjectFile.h" #include "llvm/Analysis/DebugInfo.h" #include "llvm/Constants.h" #include "llvm/Module.h" @@ -30,7 +31,6 @@ #include "llvm/CodeGen/MachineModuleInfoImpls.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" -#include "llvm/CodeGen/TargetLoweringObjectFileImpl.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/MC/MCContext.h" #include "llvm/MC/MCExpr.h" @@ -110,8 +110,12 @@ namespace { private: // Helpers for EmitStartOfAsmFile() and EmitEndOfAsmFile() void emitAttributes(); + void emitTextAttribute(ARMBuildAttrs::SpecialAttr attr, StringRef v); void emitAttribute(ARMBuildAttrs::AttrType attr, int v); + // Helper for ELF .o only + void emitARMAttributeSection(); + public: void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); @@ -495,12 +499,11 @@ void ARMAsmPrinter::EmitEndOfAsmFile(Module &M) { // Instead of subclassing the MCELFStreamer, we do the work here. void ARMAsmPrinter::emitAttributes() { - // FIXME: Add in ELF specific section handling here. - // FIXME: unify this: .cpu and CPUString with enum attributes + emitARMAttributeSection(); + std::string CPUString = Subtarget->getCPUString(); - if (CPUString != "generic") - OutStreamer.EmitRawText("\t.cpu " + Twine(CPUString)); + emitTextAttribute(ARMBuildAttrs::SEL_CPU, CPUString); // FIXME: Emit FPU type if (Subtarget->hasVFP2()) @@ -529,6 +532,26 @@ void ARMAsmPrinter::emitAttributes() { // FIXME: Should we signal R9 usage? } +void ARMAsmPrinter::emitARMAttributeSection() { + // <format-version> + // [ <section-length> "vendor-name" + // [ <file-tag> <size> <attribute>* + // | <section-tag> <size> <section-number>* 0 <attribute>* + // | <symbol-tag> <size> <symbol-number>* 0 <attribute>* + // ]+ + // ]* + + if (OutStreamer.hasRawTextSupport()) + return; + + const ARMElfTargetObjectFile &TLOFELF = + static_cast<const ARMElfTargetObjectFile &> + (getObjFileLowering()); + + OutStreamer.SwitchSection(TLOFELF.getAttributesSection()); + // Fixme: Still more to do here. +} + void ARMAsmPrinter::emitAttribute(ARMBuildAttrs::AttrType attr, int v) { if (OutStreamer.hasRawTextSupport()) { OutStreamer.EmitRawText("\t.eabi_attribute " + @@ -539,6 +562,21 @@ void ARMAsmPrinter::emitAttribute(ARMBuildAttrs::AttrType attr, int v) { } } +void ARMAsmPrinter::emitTextAttribute(ARMBuildAttrs::SpecialAttr attr, + StringRef val) { + switch (attr) { + default: assert(0 && "Unimplemented ARMBuildAttrs::SpecialAttr"); break; + case ARMBuildAttrs::SEL_CPU: + if (OutStreamer.hasRawTextSupport()) { + if (val != "generic") { + OutStreamer.EmitRawText("\t.cpu " + val); + } + } else { + // FIXME: ELF + } + } +} + //===----------------------------------------------------------------------===// static MCSymbol *getPICLabel(const char *Prefix, unsigned FunctionNumber, diff --git a/lib/Target/ARM/ARMBuildAttrs.h b/lib/Target/ARM/ARMBuildAttrs.h index 405b611220..8c54298ceb 100644 --- a/lib/Target/ARM/ARMBuildAttrs.h +++ b/lib/Target/ARM/ARMBuildAttrs.h @@ -16,7 +16,14 @@ #define __TARGET_ARMBUILDATTRS_H__ namespace ARMBuildAttrs { + enum SpecialAttr { + // This is for the .cpu asm attr. It translates into one or more + // AttrType (below) entries in the .ARM.attributes section in the ELF. + SEL_CPU + }; + enum AttrType { + // Rest correspond to ELF/.ARM.attributes File = 1, Section = 2, Symbol = 3, @@ -59,6 +66,11 @@ namespace ARMBuildAttrs { Virtualization_use = 68, MPextension_use = 70 }; + + // Magic numbers for .ARM.attributes + enum AttrMagic { + Format_Version = 0x41 + }; } #endif // __TARGET_ARMBUILDATTRS_H__ diff --git a/lib/Target/ARM/ARMTargetObjectFile.cpp b/lib/Target/ARM/ARMTargetObjectFile.cpp index 091a3b3d84..f967b4d21e 100644 --- a/lib/Target/ARM/ARMTargetObjectFile.cpp +++ b/lib/Target/ARM/ARMTargetObjectFile.cpp @@ -36,4 +36,10 @@ void ARMElfTargetObjectFile::Initialize(MCContext &Ctx, MCSectionELF::SHF_ALLOC, SectionKind::getDataRel()); } + + AttributesSection = + getContext().getELFSection(".ARM.attributes", + MCSectionELF::SHT_ARM_ATTRIBUTES, + 0, + SectionKind::getMetadata()); } diff --git a/lib/Target/ARM/ARMTargetObjectFile.h b/lib/Target/ARM/ARMTargetObjectFile.h index 097fc2cceb..c6a7261439 100644 --- a/lib/Target/ARM/ARMTargetObjectFile.h +++ b/lib/Target/ARM/ARMTargetObjectFile.h @@ -18,10 +18,19 @@ class MCContext; class TargetMachine; class ARMElfTargetObjectFile : public TargetLoweringObjectFileELF { +protected: + const MCSection *AttributesSection; public: - ARMElfTargetObjectFile() : TargetLoweringObjectFileELF() {} + ARMElfTargetObjectFile() : + TargetLoweringObjectFileELF(), + AttributesSection(NULL) + {} virtual void Initialize(MCContext &Ctx, const TargetMachine &TM); + + virtual const MCSection *getAttributesSection() const { + return AttributesSection; + } }; } // end namespace llvm |