reject invalid code like:
authorChris Lattner <sabre@nondot.org>
Thu, 13 Aug 2009 00:05:07 +0000 (00:05 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 13 Aug 2009 00:05:07 +0000 (00:05 +0000)
int x __attribute__((section("_foo, _bar"))) = 4;
int y __attribute__((section("_foo, _bar, 4byte_literals"))) = 1;

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@78867 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCSectionMachO.h
include/llvm/Target/TargetLoweringObjectFile.h
lib/Target/TargetLoweringObjectFile.cpp

index aaaa9e4e3262e3009d33efe9a28f14c5463bf364..04b2afa38c8e3e8494d06673cabab404a3b82ecc 100644 (file)
@@ -153,7 +153,7 @@ public:
   }
   
   unsigned getTypeAndAttributes() const { return TypeAndAttributes; }
-  
+  unsigned getStubSize() const { return Reserved2; }
   
   /// ParseSectionSpecifier - Parse the section specifier indicated by "Spec".
   /// This is a string that can appear after a .section directive in a mach-o
index cbb585e131be08e03d7470356c377b4945a72297..7f74c6b055cf54fa23b945dca6956b7abd1fe8f1 100644 (file)
@@ -241,6 +241,9 @@ class TargetLoweringObjectFileMachO : public TargetLoweringObjectFile {
   const MCSection *FourByteConstantSection;
   const MCSection *EightByteConstantSection;
   const MCSection *SixteenByteConstantSection;
+  
+  const MCSection *LazySymbolPointerSection;
+  const MCSection *NonLazySymbolPointerSection;
 public:
   TargetLoweringObjectFileMachO() : UniquingMap(0) {}
   ~TargetLoweringObjectFileMachO();
@@ -285,12 +288,15 @@ public:
   
   /// getLazySymbolPointerSection - Return the section corresponding to
   /// the .lazy_symbol_pointer directive.
-  const MCSection *getLazySymbolPointerSection() const;
+  const MCSection *getLazySymbolPointerSection() const {
+    return LazySymbolPointerSection;
+  }
   
   /// getNonLazySymbolPointerSection - Return the section corresponding to
   /// the .non_lazy_symbol_pointer directive.
-  const MCSection *getNonLazySymbolPointerSection() const;
-  
+  const MCSection *getNonLazySymbolPointerSection() const {
+    return NonLazySymbolPointerSection;
+  }
 };
 
 
index 904f01ae354aaf019e6aaf32822f7c040bcf23ee..094e837f6f9a118dbb642b56342cae604484d318 100644 (file)
@@ -600,6 +600,16 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
     = getMachOSection("__DATA","__datacoal_nt", MCSectionMachO::S_COALESCED,
                       SectionKind::getDataRel());
 
+  
+  LazySymbolPointerSection
+    = getMachOSection("__DATA", "__la_symbol_ptr",
+                      MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
+                      SectionKind::getMetadata());
+  NonLazySymbolPointerSection
+    = getMachOSection("__DATA", "__nl_symbol_ptr",
+                      MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
+                      SectionKind::getMetadata());
+  
   if (TM.getRelocationModel() == Reloc::Static) {
     StaticCtorSection
       = getMachOSection("__TEXT", "__constructor", 0,SectionKind::getDataRel());
@@ -666,25 +676,6 @@ void TargetLoweringObjectFileMachO::Initialize(MCContext &Ctx,
                     SectionKind::getMetadata());
 }
 
-/// getLazySymbolPointerSection - Return the section corresponding to
-/// the .lazy_symbol_pointer directive.
-const MCSection *TargetLoweringObjectFileMachO::
-getLazySymbolPointerSection() const {
-  return getMachOSection("__DATA", "__la_symbol_ptr",
-                         MCSectionMachO::S_LAZY_SYMBOL_POINTERS,
-                         SectionKind::getMetadata());
-}
-
-/// getNonLazySymbolPointerSection - Return the section corresponding to
-/// the .non_lazy_symbol_pointer directive.
-const MCSection *TargetLoweringObjectFileMachO::
-getNonLazySymbolPointerSection() const {
-  return getMachOSection("__DATA", "__nl_symbol_ptr",
-                         MCSectionMachO::S_NON_LAZY_SYMBOL_POINTERS,
-                         SectionKind::getMetadata());
-}
-
-
 const MCSection *TargetLoweringObjectFileMachO::
 getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind, 
                          Mangler *Mang, const TargetMachine &TM) const {
@@ -694,16 +685,32 @@ getExplicitSectionGlobal(const GlobalValue *GV, SectionKind Kind,
   std::string ErrorCode =
     MCSectionMachO::ParseSectionSpecifier(GV->getSection(), Segment, Section,
                                           TAA, StubSize);
-  if (ErrorCode.empty())
-    return getMachOSection(Segment, Section, TAA, StubSize, Kind);
+  if (!ErrorCode.empty()) {
+    // If invalid, report the error with llvm_report_error.
+    llvm_report_error("Global variable '" + GV->getNameStr() +
+                      "' has an invalid section specifier '" + GV->getSection()+
+                      "': " + ErrorCode + ".");
+    // Fall back to dropping it into the data section.
+    return DataSection;
+  }
   
+  // Get the section.
+  const MCSectionMachO *S =
+    getMachOSection(Segment, Section, TAA, StubSize, Kind);
+  
+  // Okay, now that we got the section, verify that the TAA & StubSize agree.
+  // If the user declared multiple globals with different section flags, we need
+  // to reject it here.
+  if (S->getTypeAndAttributes() != TAA || S->getStubSize() != StubSize) {
+    // If invalid, report the error with llvm_report_error.
+    llvm_report_error("Global variable '" + GV->getNameStr() +
+                      "' section type or attributes does not match previous"
+                      " section specifier");
+  }
   
-  // If invalid, report the error with llvm_report_error.
-  llvm_report_error("Global variable '" + GV->getNameStr() +
-                    "' has an invalid section specifier '" + GV->getSection() +
-                    "': " + ErrorCode + ".");
-  // Fall back to dropping it into the data section.
-  return DataSection;
+  
+  
+  return S;
 }
 
 const MCSection *TargetLoweringObjectFileMachO::