summaryrefslogtreecommitdiff
path: root/gcc/final.c
diff options
context:
space:
mode:
authorespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-30 13:59:58 +0000
committerespindola <espindola@138bc75d-0d04-0410-961f-82ee72b054a4>2008-07-30 13:59:58 +0000
commit9cb02f7567e731604fded7dc5c427484b82a5b55 (patch)
tree98f89aad7babbdcab71508990897edb9726f4dc6 /gcc/final.c
parent199a63ca49f5b0a431163189d05338b8de96f7ea (diff)
downloadgcc-9cb02f7567e731604fded7dc5c427484b82a5b55.tar.gz
2008-07-30 Rafael Avila de Espindola <espindola@google.com>
* final.c (call_from_call_insn): New. (final_scan_insn): Call assemble_external on FUNCTION_DECLs. 2008-07-30 Rafael Avila de Espindola <espindola@google.com> * gcc.dg/visibility-14.c: New test. * gcc.dg/visibility-15.c: New test. * gcc.dg/visibility-16.c: New test. * gcc.dg/visibility-17.c: New test. * gcc.dg/visibility-18.c: New test. * gcc.dg/visibility-19.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@138310 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/final.c')
-rw-r--r--gcc/final.c39
1 files changed, 39 insertions, 0 deletions
diff --git a/gcc/final.c b/gcc/final.c
index 787c43abad5..2a9d40ba754 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -1744,6 +1744,31 @@ output_alternate_entry_point (FILE *file, rtx insn)
}
}
+/* Given a CALL_INSN, find and return the nested CALL. */
+static rtx
+call_from_call_insn (rtx insn)
+{
+ rtx x;
+ gcc_assert (CALL_P (insn));
+ x = PATTERN (insn);
+
+ while (GET_CODE (x) != CALL)
+ {
+ switch (GET_CODE (x))
+ {
+ default:
+ gcc_unreachable ();
+ case PARALLEL:
+ x = XVECEXP (x, 0, 0);
+ break;
+ case SET:
+ x = XEXP (x, 1);
+ break;
+ }
+ }
+ return x;
+}
+
/* The final scan for one insn, INSN.
Args are same as in `final', except that INSN
is the insn being scanned.
@@ -2609,6 +2634,20 @@ final_scan_insn (rtx insn, FILE *file, int optimize ATTRIBUTE_UNUSED,
targetm.asm_out.unwind_emit (asm_out_file, insn);
#endif
+ if (CALL_P (insn))
+ {
+ rtx x = call_from_call_insn (insn);
+ x = XEXP (x, 0);
+ if (x && MEM_P (x) && GET_CODE (XEXP (x, 0)) == SYMBOL_REF)
+ {
+ tree t;
+ x = XEXP (x, 0);
+ t = SYMBOL_REF_DECL (x);
+ if (t)
+ assemble_external (t);
+ }
+ }
+
/* Output assembler code from the template. */
output_asm_insn (templ, recog_data.operand);