aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lto
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2006-08-04 19:10:26 +0000
committerDevang Patel <dpatel@apple.com>2006-08-04 19:10:26 +0000
commit304d5f2edc954a3ef9904ea6d8f9421f40c9abe4 (patch)
treef20c66c17449331c1a146828c7a4ea03c908c608 /tools/lto
parenta773bd54f32ceb55af08286fe00c6ec1b73e5b9a (diff)
downloadexternal_llvm-304d5f2edc954a3ef9904ea6d8f9421f40c9abe4.zip
external_llvm-304d5f2edc954a3ef9904ea6d8f9421f40c9abe4.tar.gz
external_llvm-304d5f2edc954a3ef9904ea6d8f9421f40c9abe4.tar.bz2
Collect references from globals.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@29530 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'tools/lto')
-rw-r--r--tools/lto/lto.cpp16
1 files changed, 11 insertions, 5 deletions
diff --git a/tools/lto/lto.cpp b/tools/lto/lto.cpp
index 3fbce69..4a8e25c 100644
--- a/tools/lto/lto.cpp
+++ b/tools/lto/lto.cpp
@@ -85,15 +85,16 @@ getLTOLinkageType(GlobalValue *v)
// Find exeternal symbols referenced by VALUE. This is a recursive function.
static void
findExternalRefs(Value *value, std::set<const char *> &references) {
-
- if (ConstantExpr *ce = dyn_cast<ConstantExpr>(value))
- for (unsigned i = 0, e = ce->getNumOperands(); i != e; ++i)
- findExternalRefs(ce->getOperand(i), references);
- else if (GlobalValue *gv = dyn_cast<GlobalValue>(value)) {
+
+ if (GlobalValue *gv = dyn_cast<GlobalValue>(value)) {
LTOLinkageTypes lt = getLTOLinkageType(gv);
if (lt != LTOInternalLinkage && strncmp (gv->getName().c_str(), "llvm.", 5))
references.insert(addUnderscore(gv->getName().c_str()));
}
+ else if (Constant *c = dyn_cast<Constant>(value))
+ // Handle ConstantExpr, ConstantStruct, ConstantArry etc..
+ for (unsigned i = 0, e = c->getNumOperands(); i != e; ++i)
+ findExternalRefs(c->getOperand(i), references);
}
/// InputFilename is a LLVM bytecode file. Read it using bytecode reader.
@@ -140,6 +141,11 @@ LinkTimeOptimizer::readLLVMObjectFile(const std::string &InputFilename,
const char *name = addUnderscore(v->getName().c_str());
LLVMSymbol *newSymbol = new LLVMSymbol(lt,v);
symbols[name] = newSymbol;
+
+ for (unsigned count = 0, total = v->getNumOperands();
+ count != total; ++count)
+ findExternalRefs(v->getOperand(count), references);
+
}
}