[llvm-commits] [llvm] r116257 - in /llvm/trunk: include/llvm/MC/MCSectionELF.h lib/Target/ARM/ARMAsmPrinter.cpp lib/Target/ARM/ARMBuildAttrs.h lib/Target/ARM/ARMTargetObjectFile.cpp lib/Target/ARM/ARMTargetObjectFile.h

Jason W Kim jason.w.kim.2009 at gmail.com
Mon Oct 11 16:01:44 PDT 2010


Author: jasonwkim
Date: Mon Oct 11 18:01:44 2010
New Revision: 116257

URL: http://llvm.org/viewvc/llvm-project?rev=116257&view=rev
Log:
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 :-)


Modified:
    llvm/trunk/include/llvm/MC/MCSectionELF.h
    llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
    llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h
    llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp
    llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h

Modified: llvm/trunk/include/llvm/MC/MCSectionELF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSectionELF.h?rev=116257&r1=116256&r2=116257&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSectionELF.h (original)
+++ llvm/trunk/include/llvm/MC/MCSectionELF.h Mon Oct 11 18:01:44 2010
@@ -121,7 +121,18 @@
     // 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.

Modified: llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp?rev=116257&r1=116256&r2=116257&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMAsmPrinter.cpp Mon Oct 11 18:01:44 2010
@@ -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 @@
   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 @@
 // 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 @@
   // 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::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,

Modified: llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h?rev=116257&r1=116256&r2=116257&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h (original)
+++ llvm/trunk/lib/Target/ARM/ARMBuildAttrs.h Mon Oct 11 18:01:44 2010
@@ -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 @@
     Virtualization_use        = 68,
     MPextension_use           = 70
   };
+
+  // Magic numbers for .ARM.attributes
+  enum AttrMagic {
+    Format_Version  = 0x41
+  };
 }
 
 #endif // __TARGET_ARMBUILDATTRS_H__

Modified: llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp?rev=116257&r1=116256&r2=116257&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp (original)
+++ llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.cpp Mon Oct 11 18:01:44 2010
@@ -36,4 +36,10 @@
                                  MCSectionELF::SHF_ALLOC,
                                  SectionKind::getDataRel());
   }
+  
+  AttributesSection =
+    getContext().getELFSection(".ARM.attributes",
+                               MCSectionELF::SHT_ARM_ATTRIBUTES,
+                               0,
+                               SectionKind::getMetadata());
 }

Modified: llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h?rev=116257&r1=116256&r2=116257&view=diff
==============================================================================
--- llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h (original)
+++ llvm/trunk/lib/Target/ARM/ARMTargetObjectFile.h Mon Oct 11 18:01:44 2010
@@ -18,10 +18,19 @@
 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





More information about the llvm-commits mailing list