Correct PIC function stub codegen.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@59006 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng
2008-11-10 23:14:47 +00:00
parent 0ef3b61c98
commit 588920b9a5
2 changed files with 52 additions and 7 deletions

View File

@@ -37,6 +37,10 @@ namespace llvm {
// PCLabelMap - A map from PC labels to addresses.
DenseMap<unsigned, intptr_t> PCLabelMap;
// Sym2IndirectSymMap - A map from symbol (GlobalValue and ExternalSymbol)
// addresses to their indirect symbol addresses.
DenseMap<void*, intptr_t> Sym2IndirectSymMap;
// IsPIC - True if the relocation model is PIC. This is used to determine
// how to codegen function stubs.
bool IsPIC;
@@ -147,6 +151,22 @@ namespace llvm {
PCLabelMap.insert(std::make_pair(Id, Addr));
}
/// getIndirectSymAddr - Retrieve the address of the indirect symbol of the
/// specified symbol located at address. Returns 0 if the indirect symbol
/// has not been emitted.
intptr_t getIndirectSymAddr(void *Addr) const {
DenseMap<void*,intptr_t>::const_iterator I= Sym2IndirectSymMap.find(Addr);
if (I != Sym2IndirectSymMap.end())
return I->second;
return 0;
}
/// addIndirectSymAddr - Add a mapping from address of an emitted symbol to
/// its indirect symbol address.
void addIndirectSymAddr(void *SymAddr, intptr_t IndSymAddr) {
Sym2IndirectSymMap.insert(std::make_pair(SymAddr, IndSymAddr));
}
private:
/// resolveRelocDestAddr - Resolve the resulting address of the relocation
/// if it's not already solved. Constantpool entries must be resolved by