[llvm] r209907 - Fix MIPS exception personality encoding.

Daniel Sanders Daniel.Sanders at imgtec.com
Tue Jun 3 02:10:03 PDT 2014


Hi Logan,

I know that you addressed Joerg's comments at http://reviews.llvm.org/D3828 but I didn't see an LGTM (or words to that effect) for this patch so I think it was still being reviewed when you committed it.

Joerg: Were you happy with the updated patch?

> -----Original Message-----
> From: llvm-commits-bounces at cs.uiuc.edu [mailto:llvm-commits-
> bounces at cs.uiuc.edu] On Behalf Of Logan Chien
> Sent: 30 May 2014 17:49
> To: llvm-commits at cs.uiuc.edu
> Subject: [llvm] r209907 - Fix MIPS exception personality encoding.
> 
> Author: logan
> Date: Fri May 30 11:48:56 2014
> New Revision: 209907
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=209907&view=rev
> Log:
> Fix MIPS exception personality encoding.
> 
> For MIPS, we have to encode the personality routine with an indirect pointer
> to absptr; otherwise, some link warning warning will be raised, and the
> program might crash in some early MIPS Android device.
> 
> Added:
>     llvm/trunk/test/CodeGen/Mips/ehframe-indirect.ll
> Modified:
>     llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
>     llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
>     llvm/trunk/lib/MC/MCObjectFileInfo.cpp
> 
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp?rev=20
> 9907&r1=209906&r2=209907&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/DwarfCFIException.cpp Fri May 30
> +++ 11:48:56 2014
> @@ -59,7 +59,7 @@ void DwarfCFIException::endModule() {
> 
>    unsigned PerEncoding = TLOF.getPersonalityEncoding();
> 
> -  if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel)
> +  if ((PerEncoding & 0x80) != dwarf::DW_EH_PE_indirect)
>      return;
> 
>    // Emit references to all used personality functions
> 
> Modified: llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp?rev=209
> 907&r1=209906&r2=209907&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp (original)
> +++ llvm/trunk/lib/CodeGen/TargetLoweringObjectFileImpl.cpp Fri May 30
> +++ 11:48:56 2014
> @@ -48,16 +48,12 @@ MCSymbol *TargetLoweringObjectFileELF::g
>      const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,
>      MachineModuleInfo *MMI) const {
>    unsigned Encoding = getPersonalityEncoding();
> -  switch (Encoding & 0x70) {
> -  default:
> -    report_fatal_error("We do not support this DWARF encoding yet!");
> -  case dwarf::DW_EH_PE_absptr:
> -    return TM.getSymbol(GV, Mang);
> -  case dwarf::DW_EH_PE_pcrel: {
> +  if ((Encoding & 0x80) == dwarf::DW_EH_PE_indirect)
>      return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +
>                                            TM.getSymbol(GV, Mang)->getName());
> -  }
> -  }
> +  if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr)
> +    return TM.getSymbol(GV, Mang);
> +  report_fatal_error("We do not support this DWARF encoding yet!");
>  }
> 
>  void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer
> &Streamer,
> 
> Modified: llvm/trunk/lib/MC/MCObjectFileInfo.cpp
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/lib/MC/MCObjectFileInfo.cpp?rev=209907&r1=209906&r
> 2=209907&view=diff
> ==========================================================
> ====================
> --- llvm/trunk/lib/MC/MCObjectFileInfo.cpp (original)
> +++ llvm/trunk/lib/MC/MCObjectFileInfo.cpp Fri May 30 11:48:56 2014
> @@ -321,6 +321,13 @@ void MCObjectFileInfo::InitELFMCObjectFi
>        TTypeEncoding = dwarf::DW_EH_PE_absptr;
>      }
>      break;
> +  case Triple::mips:
> +  case Triple::mipsel:
> +    // MIPS uses indirect pointer to refer personality functions, so that the
> +    // eh_frame section can be read-only.  DW.ref.personality will be
> generated
> +    // for relocation.
> +    PersonalityEncoding = dwarf::DW_EH_PE_indirect;
> +    break;
>    case Triple::ppc64:
>    case Triple::ppc64le:
>      PersonalityEncoding = dwarf::DW_EH_PE_indirect |
> dwarf::DW_EH_PE_pcrel |
> 
> Added: llvm/trunk/test/CodeGen/Mips/ehframe-indirect.ll
> URL: http://llvm.org/viewvc/llvm-
> project/llvm/trunk/test/CodeGen/Mips/ehframe-
> indirect.ll?rev=209907&view=auto
> ==========================================================
> ====================
> --- llvm/trunk/test/CodeGen/Mips/ehframe-indirect.ll (added)
> +++ llvm/trunk/test/CodeGen/Mips/ehframe-indirect.ll Fri May 30 11:48:56
> +++ 2014
> @@ -0,0 +1,34 @@
> +; RUN: llc -mtriple=mipsel-linux-gnu < %s | FileCheck %s ; RUN: llc
> +-mtriple=mipsel-linux-android < %s | FileCheck %s
> +
> +define i32 @main() {
> +; CHECK: .cfi_startproc
> +; CHECK: .cfi_personality 128, DW.ref.__gxx_personality_v0
> +
> +entry:
> +  invoke void @foo() to label %cont unwind label %lpad ; CHECK: foo ;
> +CHECK: jalr
> +
> +lpad:
> +  %0 = landingpad { i8*, i32 } personality i8*
> +    bitcast (i32 (...)* @__gxx_personality_v0 to i8*) catch i8* null
> +  ret i32 0
> +
> +cont:
> +  ret i32 0
> +}
> +; CHECK: .cfi_endproc
> +
> +declare i32 @__gxx_personality_v0(...)
> +
> +declare void @foo()
> +
> +; CHECK: .hidden DW.ref.__gxx_personality_v0 ; CHECK: .weak
> +DW.ref.__gxx_personality_v0 ; CHECK: .section
> +.data.DW.ref.__gxx_personality_v0,"aGw", at progbits,DW.ref.__gxx_perso
> nal
> +ity_v0,comdat
> +; CHECK: .align 2
> +; CHECK: .type DW.ref.__gxx_personality_v0, at object
> +; CHECK: .size DW.ref.__gxx_personality_v0, 4 ; CHECK:
> +DW.ref.__gxx_personality_v0:
> +; CHECK: .4byte __gxx_personality_v0
> 
> 
> _______________________________________________
> 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