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 + + * config/rs6000/rs6000.c (symbol_ref_operand): Reject symbols + who are not local for Darwin PIC. + 2004-03-22 Ulrich Weigand * 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))); }