[llvm-commits] CVS: llvm/lib/Transforms/IPO/FunctionResolution.cpp
Chris Lattner
lattner at cs.uiuc.edu
Sun Apr 27 20:24:01 PDT 2003
Changes in directory llvm/lib/Transforms/IPO:
FunctionResolution.cpp updated: 1.25 -> 1.26
---
Log message:
Fix several bugs:
* Warnings were emitted all of the time and were really annoying
* Functions could not be resolved unless they had external linkage. Linkonce
linkage was not allowed
* ConstantPointerRef's were not handled when linking functions
we now actually handle cast (CPR) to X -> cast (NewCPR) to X
---
Diffs of the changes:
Index: llvm/lib/Transforms/IPO/FunctionResolution.cpp
diff -u llvm/lib/Transforms/IPO/FunctionResolution.cpp:1.25 llvm/lib/Transforms/IPO/FunctionResolution.cpp:1.26
--- llvm/lib/Transforms/IPO/FunctionResolution.cpp:1.25 Fri Apr 18 19:15:27 2003
+++ llvm/lib/Transforms/IPO/FunctionResolution.cpp Sun Apr 27 20:23:29 2003
@@ -128,7 +128,7 @@
const FunctionType *OldMT = Old->getFunctionType();
const FunctionType *ConcreteMT = Concrete->getFunctionType();
- if (OldMT->getParamTypes().size() < ConcreteMT->getParamTypes().size() &&
+ if (OldMT->getParamTypes().size() > ConcreteMT->getParamTypes().size() &&
!ConcreteMT->isVarArg())
if (!Old->use_empty()) {
std::cerr << "WARNING: Linking function '" << Old->getName()
@@ -155,14 +155,13 @@
return Changed;
}
- // Attempt to convert all of the uses of the old function to the
- // concrete form of the function. If there is a use of the fn that
- // we don't understand here we punt to avoid making a bad
- // transformation.
+ // Attempt to convert all of the uses of the old function to the concrete
+ // form of the function. If there is a use of the fn that we don't
+ // understand here we punt to avoid making a bad transformation.
//
- // At this point, we know that the return values are the same for
- // our two functions and that the Old function has no varargs fns
- // specified. In otherwords it's just <retty> (...)
+ // At this point, we know that the return values are the same for our two
+ // functions and that the Old function has no varargs fns specified. In
+ // otherwords it's just <retty> (...)
//
for (unsigned i = 0; i < Old->use_size(); ) {
User *U = *(Old->use_begin()+i);
@@ -183,6 +182,18 @@
<< " argument or something!" << CI;
++i;
}
+ } else if (ConstantPointerRef *CPR = dyn_cast<ConstantPointerRef>(U)) {
+ if (CPR->use_size() == 1 && isa<ConstantExpr>(CPR->use_back()) &&
+ cast<ConstantExpr>(CPR->use_back())->getOpcode() ==
+ Instruction::Cast) {
+ ConstantExpr *CE = cast<ConstantExpr>(CPR->use_back());
+ Constant *NewCPR = ConstantPointerRef::get(Concrete);
+ CE->replaceAllUsesWith(ConstantExpr::getCast(NewCPR,CE->getType()));
+ CPR->destroyConstant();
+ } else {
+ std::cerr << "Cannot convert use of function: " << CPR << "\n";
+ ++i;
+ }
} else {
std::cerr << "Cannot convert use of function: " << U << "\n";
++i;
@@ -337,7 +348,7 @@
GlobalValue *GV = cast<GlobalValue>(PI->second);
assert(PI->first == GV->getName() &&
"Global name and symbol table do not agree!");
- if (GV->hasExternalLinkage()) // Only resolve decls to external fns
+ if (!GV->hasInternalLinkage()) // Only resolve decls to external fns
Globals[PI->first].push_back(GV);
}
}
More information about the llvm-commits
mailing list