Don't print spurious linking warnings about methods that are never used.

Cleanup ExprTypeConvert a bit.

llvm-svn: 1141
This commit is contained in:
Chris Lattner 2001-11-05 19:43:10 +00:00
parent 0ecba60d26
commit 7e89a616e6
2 changed files with 36 additions and 31 deletions

View File

@ -403,12 +403,11 @@ void ConvertUsersType(Value *V, Value *NewVal, ValueMapCache &VMC) {
// loops. Note that we cannot use DCE because DCE won't remove a store
// instruction, for example.
//
BasicBlock::iterator It = find(BB->begin(), BB->end(), I);
assert(It != BB->end() && "Instruction no longer in basic block??");
#ifdef DEBUG_EXPR_CONVERT
cerr << "DELETING: " << (void*)I << " " << I;
#endif
delete BB->getInstList().remove(It);
BB->getInstList().remove(I);
delete I;
}
}
@ -550,12 +549,11 @@ static void ConvertOperandToType(User *U, Value *OldVal, Value *NewVal,
// loops. Note that we cannot use DCE because DCE won't remove a store
// instruction, for example.
//
BasicBlock::iterator It = find(BIL.begin(), BIL.end(), I);
assert(It != BIL.end() && "Instruction no longer in basic block??");
#ifdef DEBUG_EXPR_CONVERT
cerr << "DELETING: " << (void*)I << " " << I;
#endif
delete BIL.remove(It);
BIL.remove(I);
delete I;
} else {
for (Value::use_iterator UI = I->use_begin(), UE = I->use_end();
UI != UE; ++UI)
@ -575,15 +573,13 @@ ValueHandle::~ValueHandle() {
// instruction, for example.
//
Instruction *I = cast<Instruction>(V);
BasicBlock *BB = I->getParent();
assert(BB && "Inst not in basic block!");
assert(I->getParent() && "Inst not in basic block!");
BasicBlock::iterator It = find(BB->begin(), BB->end(), I);
assert(It != BB->end() && "Instruction no longer in basic block??");
#ifdef DEBUG_EXPR_CONVERT
cerr << "VH DELETING: " << (void*)I << " " << I;
#endif
delete BB->getInstList().remove(It);
I->getParent()->getInstList().remove(I);
delete I;
} else {
#ifdef DEBUG_EXPR_CONVERT
cerr << "VH RELEASING: " << Operands[0];

View File

@ -105,29 +105,38 @@ bool CleanupGCCOutput::PatchUpMethodReferences(Module *M) {
for (map<string, vector<Method*> >::iterator I = Methods.begin(),
E = Methods.end(); I != E; ++I) {
vector<Method*> &Methods = I->second;
if (Methods.size() > 1) { // Found a multiply defined method.
Method *Implementation = 0; // Find the implementation
Method *Concrete = 0;
for (unsigned i = 0; i < Methods.size(); ++i) {
// TODO: Ignore methods that are never USED! DCE them.
// Remove their name. this should fix a majority of problems here.
for (unsigned i = 0; i < Methods.size(); ) {
if (!Methods[i]->isExternal()) { // Found an implementation
assert(Implementation == 0 && "Multiple definitions of the same"
" method. Case not handled yet!");
Implementation = Methods[i];
} else {
// Ignore methods that are never used so they don't cause spurious
// warnings... here we will actually DCE the function so that it isn't
// used later.
//
if (Methods[i]->use_size() == 0) {
M->getMethodList().remove(Methods[i]);
delete Methods[i];
Methods.erase(Methods.begin()+i);
Changed = true;
}
}
if (!Methods[i]->getMethodType()->isVarArg() ||
Methods[i]->getMethodType()->getParamTypes().size()) {
if (Methods[i] && (!Methods[i]->getMethodType()->isVarArg() ||
Methods[i]->getMethodType()->getParamTypes().size())) {
if (Concrete) { // Found two different methods types. Can't choose
Concrete = 0;
break;
}
Concrete = Methods[i];
}
++i;
}
if (Methods.size() > 1) { // Found a multiply defined method.
// We should find exactly one non-vararg method definition, which is
// probably the implementation. Change all of the method definitions
// and uses to use it instead.