mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-11 04:30:52 +00:00
[RuntimeDyld] Don't allocate unnecessary stub buffer space
Summary: For relocation types that are known to not require stub functions, there is no need to allocate extra space for the stub functions. Reviewers: lhames, reames, maksfb Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D14676 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253920 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
0fec8398ca
commit
96ddcceb80
@ -432,10 +432,9 @@ unsigned RuntimeDyldImpl::computeSectionStubBufSize(const ObjectFile &Obj,
|
|||||||
if (!(RelSecI == Section))
|
if (!(RelSecI == Section))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (const RelocationRef &Reloc : SI->relocations()) {
|
for (const RelocationRef &Reloc : SI->relocations())
|
||||||
(void)Reloc;
|
if (relocationNeedsStub(Reloc))
|
||||||
StubBufSize += StubSize;
|
StubBufSize += StubSize;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get section data size and alignment
|
// Get section data size and alignment
|
||||||
|
@ -1851,4 +1851,23 @@ bool RuntimeDyldELF::isCompatibleFile(const object::ObjectFile &Obj) const {
|
|||||||
return Obj.isELF();
|
return Obj.isELF();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RuntimeDyldELF::relocationNeedsStub(const RelocationRef &R) const {
|
||||||
|
if (Arch != Triple::x86_64)
|
||||||
|
return true; // Conservative answer
|
||||||
|
|
||||||
|
switch (R.getType()) {
|
||||||
|
default:
|
||||||
|
return true; // Conservative answer
|
||||||
|
|
||||||
|
|
||||||
|
case ELF::R_X86_64_GOTPCREL:
|
||||||
|
case ELF::R_X86_64_PC32:
|
||||||
|
case ELF::R_X86_64_PC64:
|
||||||
|
case ELF::R_X86_64_64:
|
||||||
|
// We know that these reloation types won't need a stub function. This list
|
||||||
|
// can be extended as needed.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace llvm
|
} // namespace llvm
|
||||||
|
@ -152,6 +152,8 @@ class RuntimeDyldELF : public RuntimeDyldImpl {
|
|||||||
SmallVector<SID, 2> UnregisteredEHFrameSections;
|
SmallVector<SID, 2> UnregisteredEHFrameSections;
|
||||||
SmallVector<SID, 2> RegisteredEHFrameSections;
|
SmallVector<SID, 2> RegisteredEHFrameSections;
|
||||||
|
|
||||||
|
bool relocationNeedsStub(const RelocationRef &R) const override;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RuntimeDyldELF(RuntimeDyld::MemoryManager &MemMgr,
|
RuntimeDyldELF(RuntimeDyld::MemoryManager &MemMgr,
|
||||||
RuntimeDyld::SymbolResolver &Resolver);
|
RuntimeDyld::SymbolResolver &Resolver);
|
||||||
|
@ -416,6 +416,11 @@ protected:
|
|||||||
// \brief Implementation of the generic part of the loadObject algorithm.
|
// \brief Implementation of the generic part of the loadObject algorithm.
|
||||||
ObjSectionToIDMap loadObjectImpl(const object::ObjectFile &Obj);
|
ObjSectionToIDMap loadObjectImpl(const object::ObjectFile &Obj);
|
||||||
|
|
||||||
|
// \brief Return true if the relocation R may require allocating a stub.
|
||||||
|
virtual bool relocationNeedsStub(const RelocationRef &R) const {
|
||||||
|
return true; // Conservative answer
|
||||||
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
RuntimeDyldImpl(RuntimeDyld::MemoryManager &MemMgr,
|
RuntimeDyldImpl(RuntimeDyld::MemoryManager &MemMgr,
|
||||||
RuntimeDyld::SymbolResolver &Resolver)
|
RuntimeDyld::SymbolResolver &Resolver)
|
||||||
|
26
test/ExecutionEngine/RuntimeDyld/X86/ELF_x86_64_StubBuf.s
Normal file
26
test/ExecutionEngine/RuntimeDyld/X86/ELF_x86_64_StubBuf.s
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# RUN: llvm-mc -triple=x86_64-apple-macosx10.10.0 -filetype=obj -o %T/test_ELF_x86_64_StubBuf.o %s
|
||||||
|
# RUN: llvm-rtdyld -print-alloc-requests -triple=x86_64-pc-linux -dummy-extern _g=196608 -verify %T/test_ELF_x86_64_StubBuf.o
|
||||||
|
|
||||||
|
# Compiled from Inputs/ELF/ELF_x86_64_StubBuf.ll
|
||||||
|
|
||||||
|
# CHECK: allocateCodeSection(Size = 42, Alignment = 16, SectionName = __text)
|
||||||
|
|
||||||
|
.section __TEXT,__text,regular,pure_instructions
|
||||||
|
.macosx_version_min 10, 10
|
||||||
|
.globl _f
|
||||||
|
.align 4, 0x90
|
||||||
|
_f: ## @f
|
||||||
|
.cfi_startproc
|
||||||
|
## BB#0: ## %entry
|
||||||
|
pushq %rax
|
||||||
|
Ltmp0:
|
||||||
|
.cfi_def_cfa_offset 16
|
||||||
|
callq _g
|
||||||
|
callq _g
|
||||||
|
callq _g
|
||||||
|
popq %rax
|
||||||
|
retq
|
||||||
|
.cfi_endproc
|
||||||
|
|
||||||
|
|
||||||
|
.subsections_via_symbols
|
@ -0,0 +1,12 @@
|
|||||||
|
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||||
|
target triple = "x86_64-apple-macosx10.10.0"
|
||||||
|
|
||||||
|
declare void @g()
|
||||||
|
|
||||||
|
define void @f() {
|
||||||
|
entry:
|
||||||
|
call void @g()
|
||||||
|
call void @g()
|
||||||
|
call void @g()
|
||||||
|
ret void
|
||||||
|
}
|
@ -132,6 +132,12 @@ DummySymbolMappings("dummy-extern",
|
|||||||
cl::ZeroOrMore,
|
cl::ZeroOrMore,
|
||||||
cl::Hidden);
|
cl::Hidden);
|
||||||
|
|
||||||
|
static cl::opt<bool>
|
||||||
|
PrintAllocationRequests("print-alloc-requests",
|
||||||
|
cl::desc("Print allocation requests made to the memory "
|
||||||
|
"manager by RuntimeDyld"),
|
||||||
|
cl::Hidden);
|
||||||
|
|
||||||
/* *** */
|
/* *** */
|
||||||
|
|
||||||
// A trivial memory manager that doesn't do anything fancy, just uses the
|
// A trivial memory manager that doesn't do anything fancy, just uses the
|
||||||
@ -211,6 +217,10 @@ uint8_t *TrivialMemoryManager::allocateCodeSection(uintptr_t Size,
|
|||||||
unsigned Alignment,
|
unsigned Alignment,
|
||||||
unsigned SectionID,
|
unsigned SectionID,
|
||||||
StringRef SectionName) {
|
StringRef SectionName) {
|
||||||
|
if (PrintAllocationRequests)
|
||||||
|
outs() << "allocateCodeSection(Size = " << Size << ", Alignment = "
|
||||||
|
<< Alignment << ", SectionName = " << SectionName << ")\n";
|
||||||
|
|
||||||
if (UsePreallocation)
|
if (UsePreallocation)
|
||||||
return allocateFromSlab(Size, Alignment, true /* isCode */);
|
return allocateFromSlab(Size, Alignment, true /* isCode */);
|
||||||
|
|
||||||
@ -227,6 +237,10 @@ uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
|
|||||||
unsigned SectionID,
|
unsigned SectionID,
|
||||||
StringRef SectionName,
|
StringRef SectionName,
|
||||||
bool IsReadOnly) {
|
bool IsReadOnly) {
|
||||||
|
if (PrintAllocationRequests)
|
||||||
|
outs() << "allocateDataSection(Size = " << Size << ", Alignment = "
|
||||||
|
<< Alignment << ", SectionName = " << SectionName << ")\n";
|
||||||
|
|
||||||
if (UsePreallocation)
|
if (UsePreallocation)
|
||||||
return allocateFromSlab(Size, Alignment, false /* isCode */);
|
return allocateFromSlab(Size, Alignment, false /* isCode */);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user