[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