<div dir="ltr"><div><div><div>Ping?<br><br></div>This commit fixes the linking error for MIPS (on Android) when exception is enabled.  Without this change, the linker will stop with error unless -Wl,--no-fatal-error is given.  Besides, in some early Android MIPS devices, this issue will even cause SEGV due to the write access to the protected text section.<br>
<br></div>Is this OK to commit?   Thanks.<br><br></div>Logan<br></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, May 20, 2014 at 12:57 AM, Logan Chien <span dir="ltr"><<a href="mailto:tzuhsiang.chien@gmail.com" target="_blank">tzuhsiang.chien@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi ahatanak,<br>
<br>
Android MIPS executable loader prohibits the relocation<br>
in the read-only section.  Thus, we have to use<br>
DW_EH_PE_indirect instead.<br>
<br>
<a href="http://reviews.llvm.org/D3828" target="_blank">http://reviews.llvm.org/D3828</a><br>
<br>
Files:<br>
  lib/CodeGen/AsmPrinter/DwarfCFIException.cpp<br>
  lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
  lib/MC/MCObjectFileInfo.cpp<br>
  test/CodeGen/Mips/ehframe-indirect.ll<br>
<br>
Index: lib/CodeGen/AsmPrinter/DwarfCFIException.cpp<br>
===================================================================<br>
--- lib/CodeGen/AsmPrinter/DwarfCFIException.cpp<br>
+++ lib/CodeGen/AsmPrinter/DwarfCFIException.cpp<br>
@@ -59,7 +59,8 @@<br>
<br>
   unsigned PerEncoding = TLOF.getPersonalityEncoding();<br>
<br>
-  if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel)<br>
+  if ((PerEncoding & 0x70) != dwarf::DW_EH_PE_pcrel &&<br>
+      (PerEncoding & 0x80) != dwarf::DW_EH_PE_indirect)<br>
     return;<br>
<br>
   // Emit references to all used personality functions<br>
Index: lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
===================================================================<br>
--- lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
+++ lib/CodeGen/TargetLoweringObjectFileImpl.cpp<br>
@@ -48,16 +48,13 @@<br>
     const GlobalValue *GV, Mangler &Mang, const TargetMachine &TM,<br>
     MachineModuleInfo *MMI) const {<br>
   unsigned Encoding = getPersonalityEncoding();<br>
-  switch (Encoding & 0x70) {<br>
-  default:<br>
-    report_fatal_error("We do not support this DWARF encoding yet!");<br>
-  case dwarf::DW_EH_PE_absptr:<br>
-    return TM.getSymbol(GV, Mang);<br>
-  case dwarf::DW_EH_PE_pcrel: {<br>
+  if ((Encoding & 0x70) == dwarf::DW_EH_PE_pcrel ||<br>
+      (Encoding & 0x80) == dwarf::DW_EH_PE_indirect)<br>
     return getContext().GetOrCreateSymbol(StringRef("DW.ref.") +<br>
                                           TM.getSymbol(GV, Mang)->getName());<br>
-  }<br>
-  }<br>
+  if ((Encoding & 0x70) == dwarf::DW_EH_PE_absptr)<br>
+    return TM.getSymbol(GV, Mang);<br>
+  report_fatal_error("We do not support this DWARF encoding yet!");<br>
 }<br>
<br>
 void TargetLoweringObjectFileELF::emitPersonalityValue(MCStreamer &Streamer,<br>
Index: lib/MC/MCObjectFileInfo.cpp<br>
===================================================================<br>
--- lib/MC/MCObjectFileInfo.cpp<br>
+++ lib/MC/MCObjectFileInfo.cpp<br>
@@ -319,6 +319,15 @@<br>
       TTypeEncoding = dwarf::DW_EH_PE_absptr;<br>
     }<br>
     break;<br>
+  case Triple::mipsel:<br>
+    if (T.getEnvironment() == Triple::Android) {<br>
+      // For Android, we have to use indirect reference to personality<br>
+      // function; otherwise, some warning will be raised during link time.<br>
+      // This will even cause some SEGV in the loader on some early Android<br>
+      // MIPS devices.<br>
+      PersonalityEncoding = dwarf::DW_EH_PE_indirect;<br>
+    }<br>
+    break;<br>
   case Triple::ppc64:<br>
   case Triple::ppc64le:<br>
     PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |<br>
Index: test/CodeGen/Mips/ehframe-indirect.ll<br>
===================================================================<br>
--- /dev/null<br>
+++ test/CodeGen/Mips/ehframe-indirect.ll<br>
@@ -0,0 +1,33 @@<br>
+; RUN: llc -mtriple=mipsel-linux-android < %s | FileCheck %s<br>
+<br>
+define i32 @main() {<br>
+; CHECK: .cfi_startproc<br>
+; CHECK: .cfi_personality 128, DW.ref.__gxx_personality_v0<br>
+<br>
+entry:<br>
+  invoke void @foo() to label %cont unwind label %lpad<br>
+; CHECK: foo<br>
+; CHECK: jalr<br>
+<br>
+lpad:<br>
+  %0 = landingpad { i8*, i32 } personality i8*<br>
+    bitcast (i32 (...)* @__gxx_personality_v0 to i8*) catch i8* null<br>
+  ret i32 0<br>
+<br>
+cont:<br>
+  ret i32 0<br>
+}<br>
+; CHECK: .cfi_endproc<br>
+<br>
+declare i32 @__gxx_personality_v0(...)<br>
+<br>
+declare void @foo()<br>
+<br>
+; CHECK: .hidden DW.ref.__gxx_personality_v0<br>
+; CHECK: .weak DW.ref.__gxx_personality_v0<br>
+; CHECK: .section .data.DW.ref.__gxx_personality_v0,"aGw",@progbits,DW.ref.__gxx_personality_v0,comdat<br>
+; CHECK: .align 2<br>
+; CHECK: .type DW.ref.__gxx_personality_v0,@object<br>
+; CHECK: .size DW.ref.__gxx_personality_v0, 4<br>
+; CHECK: DW.ref.__gxx_personality_v0:<br>
+; CHECK: .4byte __gxx_personality_v0<br>
</blockquote></div><br></div>