From aa6d25c99d99aef40d7df9e2157c8ec82fe39e96 Mon Sep 17 00:00:00 2001 From: Andrew Pinski <pinskia@physics.uc.edu> Date: Mon, 22 Mar 2004 15:04:27 +0000 Subject: [PATCH] rs6000.c (symbol_ref_operand): Reject symbols who are not local for Darwin PIC. 2004-03-22 Andrew Pinski <pinskia@physics.uc.edu> * config/rs6000/rs6000.c (symbol_ref_operand): Reject symbols who are not local for Darwin PIC. From-SVN: r79830 --- gcc/ChangeLog | 5 +++++ gcc/config/rs6000/rs6000.c | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ede0742be4f0..d37485098b34 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-03-22 Andrew Pinski <pinskia@physics.uc.edu> + + * config/rs6000/rs6000.c (symbol_ref_operand): Reject symbols + who are not local for Darwin PIC. + 2004-03-22 Ulrich Weigand <uweigand@de.ibm.com> * regrename.c (regrename_optimize): Set regs_ever_live for all diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index e046aa4dd071..8fa0ae6ab035 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -2260,6 +2260,23 @@ symbol_ref_operand (rtx op, enum machine_mode mode) if (mode != VOIDmode && GET_MODE (op) != mode) return 0; +#if TARGET_MACHO + if (GET_CODE (op) == SYMBOL_REF && TARGET_MACHO && MACHOPIC_INDIRECT) + { + /* Macho says it has to go through a stub or be local + when indirect mode. Stubs are considered local. */ + const char *t = XSTR (op, 0); + /* "&" means that it is it a local defined symbol + so it is okay to call to. */ + if (t[0] == '&') + return true; + + /* "!T" means that the function is local defined. */ + return (t[0] == '!' && t[1] == 'T'); + } +#endif + + return (GET_CODE (op) == SYMBOL_REF && (DEFAULT_ABI != ABI_AIX || SYMBOL_REF_FUNCTION_P (op))); }