[llvm-commits] [llvm] r81422 - in /llvm/trunk/lib/Target/ARM: ARMCodeEmitter.cpp ARMJITInfo.cpp

Evan Cheng evan.cheng at apple.com
Mon Nov 23 18:07:11 PST 2009


Ah actually, it looks like we are not distinguishing data indirect symbol from function stub (which is bad).

In emitFunctionStub(), I see:
      if (!LazyPtr) {
        // In PIC mode, the function stub is loading a lazy-ptr.                                                                                                                                  
        LazyPtr= (intptr_t)emitGlobalValueIndirectSym((GlobalValue*)F, Fn, JCE);
        DEBUG(if (F)
                errs() << "JIT: Indirect symbol emitted at [" << LazyPtr
                       << "] for GV '" << F->getName() << "'\n";
              else
                errs() << "JIT: Stub emitted at [" << LazyPtr
                       << "] for external function at '" << Fn << "'\n");
      }

The function stub does need to be marked executable.

Evan

On Nov 23, 2009, at 6:04 PM, Evan Cheng wrote:

> It doesn't. Looks like a copy+paste bug.
> 
> Evan
> 
> On Nov 23, 2009, at 4:53 PM, Jeffrey Yasskin wrote:
> 
>> 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
>>> 
> 
> 
> _______________________________________________
> 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