mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 20:32:21 +00:00
Handle ARM machine constantpool entry with non-lazy ptr.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58882 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
fd827c41ce
commit
e96a490d7a
@ -336,8 +336,13 @@ void ARMCodeEmitter::emitConstPoolInstruction(const MachineInstr &MI) {
|
|||||||
GlobalValue *GV = ACPV->getGV();
|
GlobalValue *GV = ACPV->getGV();
|
||||||
if (GV) {
|
if (GV) {
|
||||||
assert(!ACPV->isStub() && "Don't know how to deal this yet!");
|
assert(!ACPV->isStub() && "Don't know how to deal this yet!");
|
||||||
emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry, false,
|
if (ACPV->isNonLazyPointer())
|
||||||
(intptr_t)ACPV);
|
MCE.addRelocation(MachineRelocation::getGVNonLazyPtr(
|
||||||
|
MCE.getCurrentPCOffset(), ARM::reloc_arm_machine_cp_entry, GV,
|
||||||
|
(intptr_t)ACPV, false));
|
||||||
|
else
|
||||||
|
emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry,
|
||||||
|
ACPV->isStub(), (intptr_t)ACPV);
|
||||||
} else {
|
} else {
|
||||||
assert(!ACPV->isNonLazyPointer() && "Don't know how to deal this yet!");
|
assert(!ACPV->isNonLazyPointer() && "Don't know how to deal this yet!");
|
||||||
emitExternalSymbolAddress(ACPV->getSymbol(), ARM::reloc_arm_absolute);
|
emitExternalSymbolAddress(ACPV->getSymbol(), ARM::reloc_arm_absolute);
|
||||||
|
@ -133,14 +133,21 @@ ARMJITInfo::getLazyResolverFunction(JITCompilerFn F) {
|
|||||||
return ARMCompilationCallback;
|
return ARMCompilationCallback;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *ARMJITInfo::emitGlobalValueNonLazyPtr(const GlobalValue *GV, void *Ptr,
|
||||||
|
MachineCodeEmitter &MCE) {
|
||||||
|
MCE.startFunctionStub(GV, 4, 4); // FIXME: Rename this.
|
||||||
|
MCE.emitWordLE((intptr_t)Ptr);
|
||||||
|
return MCE.finishFunctionStub(GV);
|
||||||
|
}
|
||||||
|
|
||||||
void *ARMJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
void *ARMJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
||||||
MachineCodeEmitter &MCE) {
|
MachineCodeEmitter &MCE) {
|
||||||
unsigned addr = (intptr_t)Fn;
|
unsigned addr = (intptr_t)Fn;
|
||||||
// If this is just a call to an external function, emit a branch instead of a
|
// If this is just a call to an external function, emit a branch instead of a
|
||||||
// call. The code is the same except for one bit of the last instruction.
|
// call. The code is the same except for one bit of the last instruction.
|
||||||
if (Fn != (void*)(intptr_t)ARMCompilationCallback) {
|
if (Fn != (void*)(intptr_t)ARMCompilationCallback) {
|
||||||
// branch to the corresponding function addr
|
// Branch to the corresponding function addr.
|
||||||
// the stub is 8-byte size and 4-aligned
|
// The stub is 8-byte size and 4-aligned.
|
||||||
MCE.startFunctionStub(F, 8, 4);
|
MCE.startFunctionStub(F, 8, 4);
|
||||||
MCE.emitWordLE(0xe51ff004); // LDR PC, [PC,#-4]
|
MCE.emitWordLE(0xe51ff004); // LDR PC, [PC,#-4]
|
||||||
MCE.emitWordLE(addr); // addr of function
|
MCE.emitWordLE(addr); // addr of function
|
||||||
@ -150,8 +157,8 @@ void *ARMJITInfo::emitFunctionStub(const Function* F, void *Fn,
|
|||||||
// This stub sets the return address to restart the stub, so that
|
// This stub sets the return address to restart the stub, so that
|
||||||
// the new branch will be invoked when we come back.
|
// the new branch will be invoked when we come back.
|
||||||
//
|
//
|
||||||
// branch and link to the compilation callback.
|
// Branch and link to the compilation callback.
|
||||||
// the stub is 16-byte size and 4-byte aligned.
|
// The stub is 16-byte size and 4-byte aligned.
|
||||||
MCE.startFunctionStub(F, 16, 4);
|
MCE.startFunctionStub(F, 16, 4);
|
||||||
// Save LR so the callback can determine which stub called it.
|
// Save LR so the callback can determine which stub called it.
|
||||||
// The compilation callback is responsible for popping this prior
|
// The compilation callback is responsible for popping this prior
|
||||||
|
@ -49,6 +49,12 @@ namespace llvm {
|
|||||||
///
|
///
|
||||||
virtual void replaceMachineCodeForFunction(void *Old, void *New);
|
virtual void replaceMachineCodeForFunction(void *Old, void *New);
|
||||||
|
|
||||||
|
/// emitGlobalValueNonLazyPtr - Use the specified MachineCodeEmitter object
|
||||||
|
/// to emit a Mac OS X non-lazy pointer which contains the address of the
|
||||||
|
/// specified ptr.
|
||||||
|
virtual void *emitGlobalValueNonLazyPtr(const GlobalValue *GV, void *Ptr,
|
||||||
|
MachineCodeEmitter &MCE);
|
||||||
|
|
||||||
/// emitFunctionStub - Use the specified MachineCodeEmitter object to emit a
|
/// emitFunctionStub - Use the specified MachineCodeEmitter object to emit a
|
||||||
/// small native function that simply calls the function at the specified
|
/// small native function that simply calls the function at the specified
|
||||||
/// address.
|
/// address.
|
||||||
|
Loading…
Reference in New Issue
Block a user