aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorClaudiu Zissulescu <claziss@synopsys.com>2017-04-25 14:04:36 +0200
committerClaudiu Zissulescu <claziss@gcc.gnu.org>2017-04-25 14:04:36 +0200
commit1f8876c786ee2ea08adca27e632a9197bb90ffe7 (patch)
tree141bbc137ae63555d3af874a66cdcde5008b3004 /gcc
parent8b22ef6af9e6e834600a2e1af844d0309774f610 (diff)
downloadgcc-1f8876c786ee2ea08adca27e632a9197bb90ffe7.zip
gcc-1f8876c786ee2ea08adca27e632a9197bb90ffe7.tar.gz
gcc-1f8876c786ee2ea08adca27e632a9197bb90ffe7.tar.bz2
[ARC] Fix calling multiple inheritances.
The TARGET_ASM_OUTPUT_MI_THUNK hook doesn't take into account the variant when we compile for PIC. gcc/ 2017-04-25 Claudiu Zissulescu <claziss@synopsys.com> * config/arc/arc.c (arc_output_mi_thunk): Emit PIC calls. From-SVN: r247200
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/arc/arc.c24
2 files changed, 25 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 5faeb0e..82ece70 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,9 @@
2017-04-25 Claudiu Zissulescu <claziss@synopsys.com>
+ * config/arc/arc.c (arc_output_mi_thunk): Emit PIC calls.
+
+2017-04-25 Claudiu Zissulescu <claziss@synopsys.com>
+
* config/arc/arc.c (arc_conditional_register_usage): Use ACCL,
ACCH registers whenever they are available.
diff --git a/gcc/config/arc/arc.c b/gcc/config/arc/arc.c
index 0c6b96f..cdf7a64 100644
--- a/gcc/config/arc/arc.c
+++ b/gcc/config/arc/arc.c
@@ -6302,10 +6302,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);
}