[llvm-commits] CVS: llvm/lib/VMCore/AsmWriter.cpp Mangler.cpp Verifier.cpp

Anton Korobeynikov asl at math.spbu.ru
Thu Sep 14 11:24:07 PDT 2006



Changes in directory llvm/lib/VMCore:

AsmWriter.cpp updated: 1.204 -> 1.205
Mangler.cpp updated: 1.29 -> 1.30
Verifier.cpp updated: 1.162 -> 1.163
---
Log message:

Adding dllimport, dllexport and external weak linkage types.
DLL* linkages got full (I hope) codegeneration support in C & both x86 
assembler backends.
External weak linkage added for future use, we don't provide any 
codegeneration, etc. support for it.


---
Diffs of the changes:  (+43 -16)

 AsmWriter.cpp |   36 +++++++++++++++++++++++++-----------
 Mangler.cpp   |   11 ++++++++---
 Verifier.cpp  |   12 ++++++++++--
 3 files changed, 43 insertions(+), 16 deletions(-)


Index: llvm/lib/VMCore/AsmWriter.cpp
diff -u llvm/lib/VMCore/AsmWriter.cpp:1.204 llvm/lib/VMCore/AsmWriter.cpp:1.205
--- llvm/lib/VMCore/AsmWriter.cpp:1.204	Sun Aug 27 20:02:49 2006
+++ llvm/lib/VMCore/AsmWriter.cpp	Thu Sep 14 13:23:27 2006
@@ -845,14 +845,21 @@
   if (GV->hasName()) Out << getLLVMName(GV->getName()) << " = ";
 
   if (!GV->hasInitializer())
-    Out << "external ";
+    switch (GV->getLinkage()) {
+     case GlobalValue::DLLImportLinkage:   Out << "dllimport "; break;
+     case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
+     default: Out << "external "; break;
+    }
   else
     switch (GV->getLinkage()) {
-    case GlobalValue::InternalLinkage:  Out << "internal "; break;
-    case GlobalValue::LinkOnceLinkage:  Out << "linkonce "; break;
-    case GlobalValue::WeakLinkage:      Out << "weak "; break;
-    case GlobalValue::AppendingLinkage: Out << "appending "; break;
-    case GlobalValue::ExternalLinkage: break;
+    case GlobalValue::InternalLinkage:     Out << "internal "; break;
+    case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
+    case GlobalValue::WeakLinkage:         Out << "weak "; break;
+    case GlobalValue::AppendingLinkage:    Out << "appending "; break;
+    case GlobalValue::DLLImportLinkage:    Out << "dllimport "; break;
+    case GlobalValue::DLLExportLinkage:    Out << "dllexport "; break;     
+    case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;
+    case GlobalValue::ExternalLinkage:     break;
     case GlobalValue::GhostLinkage:
       std::cerr << "GhostLinkage not allowed in AsmWriter!\n";
       abort();
@@ -937,13 +944,20 @@
   if (AnnotationWriter) AnnotationWriter->emitFunctionAnnot(F, Out);
 
   if (F->isExternal())
-    Out << "declare ";
+    switch (F->getLinkage()) {
+    case GlobalValue::DLLImportLinkage:    Out << "declare dllimport "; break;
+    case GlobalValue::ExternalWeakLinkage: Out << "declare extern_weak "; break;
+    default: Out << "declare ";
+    }
   else
     switch (F->getLinkage()) {
-    case GlobalValue::InternalLinkage:  Out << "internal "; break;
-    case GlobalValue::LinkOnceLinkage:  Out << "linkonce "; break;
-    case GlobalValue::WeakLinkage:      Out << "weak "; break;
-    case GlobalValue::AppendingLinkage: Out << "appending "; break;
+    case GlobalValue::InternalLinkage:     Out << "internal "; break;
+    case GlobalValue::LinkOnceLinkage:     Out << "linkonce "; break;
+    case GlobalValue::WeakLinkage:         Out << "weak "; break;
+    case GlobalValue::AppendingLinkage:    Out << "appending "; break;
+    case GlobalValue::DLLImportLinkage:    Out << "dllimport "; break;
+    case GlobalValue::DLLExportLinkage:    Out << "dllexport "; break;
+    case GlobalValue::ExternalWeakLinkage: Out << "extern_weak "; break;      
     case GlobalValue::ExternalLinkage: break;
     case GlobalValue::GhostLinkage:
       std::cerr << "GhostLinkage not allowed in AsmWriter!\n";


Index: llvm/lib/VMCore/Mangler.cpp
diff -u llvm/lib/VMCore/Mangler.cpp:1.29 llvm/lib/VMCore/Mangler.cpp:1.30
--- llvm/lib/VMCore/Mangler.cpp:1.29	Thu Sep  7 13:20:41 2006
+++ llvm/lib/VMCore/Mangler.cpp	Thu Sep 14 13:23:27 2006
@@ -162,11 +162,16 @@
     ExistingValue = GV;
   } else {
     // If GV is external but the existing one is static, mangle the existing one
-    if (GV->hasExternalLinkage() && !ExistingValue->hasExternalLinkage()) {
+    if ((GV->hasExternalLinkage() || GV->hasDLLImportLinkage()) &&
+        !(ExistingValue->hasExternalLinkage() || ExistingValue->hasDLLImportLinkage())) {
       MangledGlobals.insert(ExistingValue);
       ExistingValue = GV;
-    } else if (GV->hasExternalLinkage() && ExistingValue->hasExternalLinkage()&&
-               GV->isExternal() && ExistingValue->isExternal()) {
+    } else if ((GV->hasExternalLinkage() ||
+                GV->hasDLLImportLinkage()) &&
+               (ExistingValue->hasExternalLinkage() ||
+                ExistingValue->hasDLLImportLinkage()) &&
+               GV->isExternal() &&
+               ExistingValue->isExternal()) {
       // If the two globals both have external inkage, and are both external,
       // don't mangle either of them, we just have some silly type mismatch.
     } else {


Index: llvm/lib/VMCore/Verifier.cpp
diff -u llvm/lib/VMCore/Verifier.cpp:1.162 llvm/lib/VMCore/Verifier.cpp:1.163
--- llvm/lib/VMCore/Verifier.cpp:1.162	Sun Aug 27 17:42:52 2006
+++ llvm/lib/VMCore/Verifier.cpp	Thu Sep 14 13:23:27 2006
@@ -257,8 +257,16 @@
 
 
 void Verifier::visitGlobalValue(GlobalValue &GV) {
-  Assert1(!GV.isExternal() || GV.hasExternalLinkage(),
-          "Global is external, but doesn't have external linkage!", &GV);
+  Assert1(!GV.isExternal() ||
+          GV.hasExternalLinkage() ||
+          GV.hasDLLImportLinkage() ||
+          GV.hasExternalWeakLinkage(),
+  "Global is external, but doesn't have external or dllimport or weak linkage!",
+          &GV);
+
+  Assert1(!GV.hasDLLImportLinkage() || GV.isExternal(),
+          "Global is marked as dllimport, but not external", &GV);
+  
   Assert1(!GV.hasAppendingLinkage() || isa<GlobalVariable>(GV),
           "Only global variables can have appending linkage!", &GV);
 






More information about the llvm-commits mailing list