aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2003-12-31 20:21:04 +0000
committerChris Lattner <sabre@nondot.org>2003-12-31 20:21:04 +0000
commit55d86482bd9fac6f90a7f6fb35c2f4dec9569fdb (patch)
tree85a9ae0d796620882e23c43fd298583e9a256fa5 /lib
parentc8a07d7378699b8d11ce2a1549b984d84706da19 (diff)
downloadexternal_llvm-55d86482bd9fac6f90a7f6fb35c2f4dec9569fdb.zip
external_llvm-55d86482bd9fac6f90a7f6fb35c2f4dec9569fdb.tar.gz
external_llvm-55d86482bd9fac6f90a7f6fb35c2f4dec9569fdb.tar.bz2
Add new ExecutionEngine::getGlobalValueAtAddress method, which can efficiently
turn a memory address back into the LLVM global object that starts at that address. Note that this won't cause any additional datastructures to be built for clients of the EE that don't need this information. Also modified some code to not access the GlobalAddress map directly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@10674 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/ExecutionEngine/ExecutionEngine.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/ExecutionEngine/ExecutionEngine.cpp b/lib/ExecutionEngine/ExecutionEngine.cpp
index 45643ab..76ba228 100644
--- a/lib/ExecutionEngine/ExecutionEngine.cpp
+++ b/lib/ExecutionEngine/ExecutionEngine.cpp
@@ -47,6 +47,21 @@ ExecutionEngine::~ExecutionEngine() {
delete MP;
}
+/// getGlobalValueAtAddress - Return the LLVM global value object that starts
+/// at the specified address.
+///
+const GlobalValue *ExecutionEngine::getGlobalValueAtAddress(void *Addr) {
+ // If we haven't computed the reverse mapping yet, do so first.
+ if (GlobalAddressReverseMap.empty()) {
+ for (std::map<const GlobalValue*, void *>::iterator I =
+ GlobalAddressMap.begin(), E = GlobalAddressMap.end(); I != E; ++I)
+ GlobalAddressReverseMap.insert(std::make_pair(I->second, I->first));
+ }
+
+ std::map<void *, const GlobalValue*>::iterator I =
+ GlobalAddressReverseMap.find(Addr);
+ return I != GlobalAddressReverseMap.end() ? I->second : 0;
+}
// CreateArgv - Turn a vector of strings into a nice argv style array of
// pointers to null terminated strings.
@@ -133,8 +148,8 @@ void *ExecutionEngine::getPointerToGlobal(const GlobalValue *GV) {
if (Function *F = const_cast<Function*>(dyn_cast<Function>(GV)))
return getPointerToFunction(F);
- assert(GlobalAddress[GV] && "Global hasn't had an address allocated yet?");
- return GlobalAddress[GV];
+ assert(GlobalAddressMap[GV] && "Global hasn't had an address allocated yet?");
+ return GlobalAddressMap[GV];
}
/// FIXME: document
@@ -435,12 +450,12 @@ void ExecutionEngine::emitGlobals() {
addGlobalMapping(I, new char[Size]);
DEBUG(std::cerr << "Global '" << I->getName() << "' -> "
- << (void*)GlobalAddress[I] << "\n");
+ << getPointerToGlobal(I) << "\n");
} else {
// External variable reference. Try to use the dynamic loader to
// get a pointer to it.
if (void *SymAddr = GetAddressOfSymbol(I->getName().c_str()))
- GlobalAddress[I] = SymAddr;
+ addGlobalMapping(I, SymAddr);
else {
std::cerr << "Could not resolve external global address: "
<< I->getName() << "\n";
@@ -460,11 +475,12 @@ void ExecutionEngine::emitGlobals() {
// address specified in GlobalAddresses, or allocates new memory if it's not
// already in the map.
void ExecutionEngine::EmitGlobalVariable(const GlobalVariable *GV) {
- void *&GA = GlobalAddress[GV];
+ void *GA = getPointerToGlobalIfAvailable(GV);
const Type *ElTy = GV->getType()->getElementType();
if (GA == 0) {
// If it's not already specified, allocate memory for the global.
GA = new char[getTargetData().getTypeSize(ElTy)];
+ addGlobalMapping(GV, GA);
}
InitializeMemory(GV->getInitializer(), GA);