The TARGET_ASM_OUTPUT_MI_THUNK hook doesn't take into account the
variant when we compile for PIC.

gcc/
2016-12-13  Claudiu Zissulescu  <claz...@synopsys.com>

        * config/arc/arc.c (arc_output_mi_thunk): Emit PIC calls.
---
 gcc/config/arc/arc.c | 24 +++++++++++++++++++++---
 1 file changed, 21 insertions(+), 3 deletions(-)

diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 73d72c68..36582d2 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -6434,10 +6434,28 @@ arc_output_mi_thunk (FILE *file, tree thunk 
ATTRIBUTE_UNUSED,
   fnaddr = XEXP (DECL_RTL (function), 0);
 
   if (arc_is_longcall_p (fnaddr))
-    fputs ("\tj\t", file);
+    {
+      if (flag_pic)
+       {
+         asm_fprintf (file, "\tld\t%s, [pcl, @",
+                      ARC_TEMP_SCRATCH_REG);
+         assemble_name (file, XSTR (fnaddr, 0));
+         fputs ("@gotpc]\n", file);
+         asm_fprintf (file, "\tj\t[%s]", ARC_TEMP_SCRATCH_REG);
+       }
+      else
+       {
+         fputs ("\tj\t@", file);
+         assemble_name (file, XSTR (fnaddr, 0));
+       }
+    }
   else
-    fputs ("\tb\t", file);
-  assemble_name (file, XSTR (fnaddr, 0));
+    {
+      fputs ("\tb\t@", file);
+      assemble_name (file, XSTR (fnaddr, 0));
+      if (flag_pic)
+       fputs ("@plt\n", file);
+    }
   fputc ('\n', file);
 }
 
-- 
1.9.1

Reply via email to