[llvm-commits] [llvm] r81422 - in /llvm/trunk/lib/Target/ARM: ARMCodeEmitter.cpp ARMJITInfo.cpp
Jeffrey Yasskin
jyasskin at google.com
Mon Nov 23 16:53:23 PST 2009
Hi Evan. Why does ARM need to mark the indirect symbol executable?
It's loading from that address not executing it.
Is there a test that the change to ARMJITInfo.cpp fixes?
On Wed, Sep 9, 2009 at 5:23 PM, Evan Cheng <evan.cheng at apple.com> wrote:
> Author: evancheng
> Date: Wed Sep 9 20:23:53 2009
> New Revision: 81422
>
> URL: http://llvm.org/viewvc/llvm-project?rev=81422&view=rev
> Log:
> Proper support of non-lazy indirect symbols.
>
> Modified:
> llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp
> llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp
>
> Modified: llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp?rev=81422&r1=81421&r2=81422&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMCodeEmitter.cpp Wed Sep 9 20:23:53 2009
> @@ -60,6 +60,7 @@
> ARMJITInfo *JTI;
> const ARMInstrInfo *II;
> const TargetData *TD;
> + const ARMSubtarget *Subtarget;
> TargetMachine &TM;
> CodeEmitter &MCE;
> const std::vector<MachineConstantPoolEntry> *MCPEs;
> @@ -163,7 +164,7 @@
> /// Routines that handle operands which add machine relocations which are
> /// fixed up by the relocation stage.
> void emitGlobalAddress(GlobalValue *GV, unsigned Reloc,
> - bool NeedStub, intptr_t ACPV = 0);
> + bool NeedStub, bool Indirect, intptr_t ACPV = 0);
> void emitExternalSymbolAddress(const char *ES, unsigned Reloc);
> void emitConstPoolAddress(unsigned CPI, unsigned Reloc);
> void emitJumpTableAddress(unsigned JTIndex, unsigned Reloc);
> @@ -195,9 +196,10 @@
> assert((MF.getTarget().getRelocationModel() != Reloc::Default ||
> MF.getTarget().getRelocationModel() != Reloc::Static) &&
> "JIT relocation model must be set to static or default!");
> + JTI = ((ARMTargetMachine&)MF.getTarget()).getJITInfo();
> II = ((ARMTargetMachine&)MF.getTarget()).getInstrInfo();
> TD = ((ARMTargetMachine&)MF.getTarget()).getTargetData();
> - JTI = ((ARMTargetMachine&)MF.getTarget()).getJITInfo();
> + Subtarget = &TM.getSubtarget<ARMSubtarget>();
> MCPEs = &MF.getConstantPool()->getConstants();
> MJTEs = &MF.getJumpTableInfo()->getJumpTables();
> IsPIC = TM.getRelocationModel() == Reloc::PIC_;
> @@ -244,7 +246,7 @@
> else if (MO.isImm())
> return static_cast<unsigned>(MO.getImm());
> else if (MO.isGlobal())
> - emitGlobalAddress(MO.getGlobal(), ARM::reloc_arm_branch, true);
> + emitGlobalAddress(MO.getGlobal(), ARM::reloc_arm_branch, true, false);
> else if (MO.isSymbol())
> emitExternalSymbolAddress(MO.getSymbolName(), ARM::reloc_arm_branch);
> else if (MO.isCPI()) {
> @@ -270,9 +272,14 @@
> ///
> template<class CodeEmitter>
> void Emitter<CodeEmitter>::emitGlobalAddress(GlobalValue *GV, unsigned Reloc,
> - bool NeedStub, intptr_t ACPV) {
> - MCE.addRelocation(MachineRelocation::getGV(MCE.getCurrentPCOffset(), Reloc,
> - GV, ACPV, NeedStub));
> + bool NeedStub, bool Indirect,
> + intptr_t ACPV) {
> + MachineRelocation MR = Indirect
> + ? MachineRelocation::getIndirectSymbol(MCE.getCurrentPCOffset(), Reloc,
> + GV, ACPV, NeedStub)
> + : MachineRelocation::getGV(MCE.getCurrentPCOffset(), Reloc,
> + GV, ACPV, NeedStub);
> + MCE.addRelocation(MR);
> }
>
> /// emitExternalSymbolAddress - Arrange for the address of an external symbol to
> @@ -417,8 +424,11 @@
>
> GlobalValue *GV = ACPV->getGV();
> if (GV) {
> + Reloc::Model RelocM = TM.getRelocationModel();
> emitGlobalAddress(GV, ARM::reloc_arm_machine_cp_entry,
> - isa<Function>(GV), (intptr_t)ACPV);
> + isa<Function>(GV),
> + Subtarget->GVIsIndirectSymbol(GV, RelocM),
> + (intptr_t)ACPV);
> } else {
> emitExternalSymbolAddress(ACPV->getSymbol(), ARM::reloc_arm_absolute);
> }
> @@ -437,7 +447,7 @@
> });
>
> if (GlobalValue *GV = dyn_cast<GlobalValue>(CV)) {
> - emitGlobalAddress(GV, ARM::reloc_arm_absolute, isa<Function>(GV));
> + emitGlobalAddress(GV, ARM::reloc_arm_absolute, isa<Function>(GV), false);
> emitWordLE(0);
> } else if (const ConstantInt *CI = dyn_cast<ConstantInt>(CV)) {
> uint32_t Val = *(uint32_t*)CI->getValue().getRawData();
>
> Modified: llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp?rev=81422&r1=81421&r2=81422&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp (original)
> +++ llvm/trunk/lib/Target/ARM/ARMJITInfo.cpp Wed Sep 9 20:23:53 2009
> @@ -145,6 +145,9 @@
> llvm_unreachable("ERROR: Unable to mark indirect symbol writable");
> }
> JCE.emitWordLE((intptr_t)Ptr);
> + if (!sys::Memory::setRangeExecutable((void*)Addr, 4)) {
> + llvm_unreachable("ERROR: Unable to mark indirect symbol executable");
> + }
> void *PtrAddr = JCE.finishGVStub(GV);
> addIndirectSymAddr(Ptr, (intptr_t)PtrAddr);
> return PtrAddr;
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
More information about the llvm-commits
mailing list