]> granicus.if.org Git - llvm/commitdiff
Add code to verify correctly linkages
authorChris Lattner <sabre@nondot.org>
Wed, 16 Apr 2003 20:42:40 +0000 (20:42 +0000)
committerChris Lattner <sabre@nondot.org>
Wed, 16 Apr 2003 20:42:40 +0000 (20:42 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5788 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Verifier.cpp

index e156692ee8ee81c5ac60fbb559f6e2f6f470678b..0165e3b8cb055eb5280481ab4ab58c7ec1c6cfbd 100644 (file)
@@ -94,8 +94,7 @@ namespace {  // Anonymous namespace for class
     bool doFinalization(Module &M) {
       // Scan through, checking all of the external function's linkage now...
       for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I)
-        if (I->isExternal() && I->hasInternalLinkage())
-          CheckFailed("Function Declaration has Internal Linkage!", I);
+        visitGlobalValue(*I);
 
       for (Module::giterator I = M.gbegin(), E = M.gend(); I != E; ++I)
         if (I->isExternal() && I->hasInternalLinkage())
@@ -122,8 +121,10 @@ namespace {  // Anonymous namespace for class
       }
     }
 
+
     // Verification methods...
     void verifySymbolTable(SymbolTable &ST);
+    void visitGlobalValue(GlobalValue &GV);
     void visitFunction(Function &F);
     void visitBasicBlock(BasicBlock &BB);
     void visitPHINode(PHINode &PN);
@@ -171,6 +172,19 @@ namespace {  // Anonymous namespace for class
   do { if (!(C)) { CheckFailed(M, V1, V2, V3, V4); return; } } while (0)
 
 
+void Verifier::visitGlobalValue(GlobalValue &GV) {
+  Assert1(!GV.isExternal() || GV.hasExternalLinkage(),
+          "Global value has Internal Linkage!", &GV);
+  Assert1(!GV.hasAppendingLinkage() || isa<GlobalVariable>(GV),
+          "Only global variables can have appending linkage!", &GV);
+
+  if (GV.hasAppendingLinkage()) {
+    GlobalVariable &GVar = cast<GlobalVariable>(GV);
+    Assert1(isa<ArrayType>(GVar.getType()->getElementType()),
+            "Only global arrays can have appending linkage!", &GV);
+  }
+}
+
 // verifySymbolTable - Verify that a function or module symbol table is ok
 //
 void Verifier::verifySymbolTable(SymbolTable &ST) {