[MC] Common symbols weren't being checked for redeclaration which allowed an assembly...
authorColin LeMahieu <colinl@codeaurora.org>
Sat, 6 Jun 2015 20:12:40 +0000 (20:12 +0000)
committerColin LeMahieu <colinl@codeaurora.org>
Sat, 6 Jun 2015 20:12:40 +0000 (20:12 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@239227 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCSymbol.h
lib/MC/MCELFStreamer.cpp
test/MC/ELF/common-error3.s [new file with mode: 0644]
test/MC/ELF/common-redeclare.s [new file with mode: 0644]

index 137251b63564b9da66ef4e54c61d2a006c0aa34e..7f74f378d465102a949a409a8d23103225d53227 100644 (file)
@@ -258,6 +258,21 @@ public:
     return CommonAlign;
   }
 
+  /// Declare this symbol as being 'common'.
+  ///
+  /// \param Size - The size of the symbol.
+  /// \param Align - The alignment of the symbol.
+  /// \return True if symbol was already declared as a different type
+  bool declareCommon(uint64_t Size, unsigned Align) {
+    assert(isCommon() || getOffset() == 0);
+    if(isCommon()) {
+      if(CommonSize != Size || CommonAlign != Align)
+       return true;
+    } else
+      setCommon(Size, Align);
+    return false;
+  }
+
   /// Is this a 'common' symbol.
   bool isCommon() const { return CommonAlign != -1U; }
 
index da664f578034b2783d23b11fdd5b9fc2223aa332..e0f4a2ae16a36652c3893f6e5c5dfca11f9f7557 100644 (file)
@@ -320,7 +320,9 @@ void MCELFStreamer::EmitCommonSymbol(MCSymbol *S, uint64_t Size,
     struct LocalCommon L = {Symbol, Size, ByteAlignment};
     LocalCommons.push_back(L);
   } else {
-    Symbol->setCommon(Size, ByteAlignment);
+    if(Symbol->declareCommon(Size, ByteAlignment))
+      report_fatal_error("Symbol: " + Symbol->getName() +
+                         " redeclared as different type");
   }
 
   cast<MCSymbolELF>(Symbol)
diff --git a/test/MC/ELF/common-error3.s b/test/MC/ELF/common-error3.s
new file mode 100644 (file)
index 0000000..a84779e
--- /dev/null
@@ -0,0 +1,5 @@
+# RUN: not llvm-mc -filetype=obj -triple x86_64-pc-linux %s 2>&1 | FileCheck %s
+
+# CHECK: Symbol: C redeclared as different type
+        .comm   C,4,4
+        .comm   C,8,4
\ No newline at end of file
diff --git a/test/MC/ELF/common-redeclare.s b/test/MC/ELF/common-redeclare.s
new file mode 100644 (file)
index 0000000..f8ee17d
--- /dev/null
@@ -0,0 +1,5 @@
+# RUN: llvm-mc -filetype=obj -triple x86_64-pc-linux %s | llvm-objdump -t - | FileCheck %s
+
+# CHECK: 0000000000000004 g       *COM*  00000004 C
+        .comm   C,4,4
+        .comm   C,4,4
\ No newline at end of file