mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-13 14:47:00 +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))
|
||||
continue;
|
||||
|
||||
for (const RelocationRef &Reloc : SI->relocations()) {
|
||||
(void)Reloc;
|
||||
StubBufSize += StubSize;
|
||||
}
|
||||
for (const RelocationRef &Reloc : SI->relocations())
|
||||
if (relocationNeedsStub(Reloc))
|
||||
StubBufSize += StubSize;
|
||||
}
|
||||
|
||||
// Get section data size and alignment
|
||||
|
@ -1851,4 +1851,23 @@ bool RuntimeDyldELF::isCompatibleFile(const object::ObjectFile &Obj) const {
|
||||
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
|
||||
|
@ -152,6 +152,8 @@ class RuntimeDyldELF : public RuntimeDyldImpl {
|
||||
SmallVector<SID, 2> UnregisteredEHFrameSections;
|
||||
SmallVector<SID, 2> RegisteredEHFrameSections;
|
||||
|
||||
bool relocationNeedsStub(const RelocationRef &R) const override;
|
||||
|
||||
public:
|
||||
RuntimeDyldELF(RuntimeDyld::MemoryManager &MemMgr,
|
||||
RuntimeDyld::SymbolResolver &Resolver);
|
||||
|
@ -416,6 +416,11 @@ protected:
|
||||
// \brief Implementation of the generic part of the loadObject algorithm.
|
||||
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:
|
||||
RuntimeDyldImpl(RuntimeDyld::MemoryManager &MemMgr,
|
||||
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::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
|
||||
@ -211,6 +217,10 @@ uint8_t *TrivialMemoryManager::allocateCodeSection(uintptr_t Size,
|
||||
unsigned Alignment,
|
||||
unsigned SectionID,
|
||||
StringRef SectionName) {
|
||||
if (PrintAllocationRequests)
|
||||
outs() << "allocateCodeSection(Size = " << Size << ", Alignment = "
|
||||
<< Alignment << ", SectionName = " << SectionName << ")\n";
|
||||
|
||||
if (UsePreallocation)
|
||||
return allocateFromSlab(Size, Alignment, true /* isCode */);
|
||||
|
||||
@ -227,6 +237,10 @@ uint8_t *TrivialMemoryManager::allocateDataSection(uintptr_t Size,
|
||||
unsigned SectionID,
|
||||
StringRef SectionName,
|
||||
bool IsReadOnly) {
|
||||
if (PrintAllocationRequests)
|
||||
outs() << "allocateDataSection(Size = " << Size << ", Alignment = "
|
||||
<< Alignment << ", SectionName = " << SectionName << ")\n";
|
||||
|
||||
if (UsePreallocation)
|
||||
return allocateFromSlab(Size, Alignment, false /* isCode */);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user