From 0c8685ea9c02a53e7b9220d10240ab70d069ad00 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Mon, 22 Oct 2007 20:11:19 +0000 Subject: [PATCH] re PR target/33169 (Compiler generates two different relocs for the same symbol) gcc/ PR target/33169 Backport from mainline: 2006-10-29 Richard Sandiford * config/mips/mips.c (mips_classify_symbol): Test DECL_WEAK as well as TREE_PUBLIC when deciding whether to return SYMBOL_GOT_GLOBAL. From-SVN: r129559 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/mips/mips.c | 19 +++++++++++++------ 2 files changed, 23 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index deaab711885f..6bc59f0fa60e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2007-10-22 Richard Sandiford + + PR target/33169 + Backport from mainline: + + 2006-10-29 Richard Sandiford + + * config/mips/mips.c (mips_classify_symbol): Test DECL_WEAK as well + as TREE_PUBLIC when deciding whether to return SYMBOL_GOT_GLOBAL. + 2007-10-22 Richard Sandiford Backport from mainline: diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c index c1f6a4d2a012..40d14799ab0a 100644 --- a/gcc/config/mips/mips.c +++ b/gcc/config/mips/mips.c @@ -1197,6 +1197,8 @@ struct gcc_target targetm = TARGET_INITIALIZER; static enum mips_symbol_type mips_classify_symbol (rtx x) { + tree decl; + if (GET_CODE (x) == LABEL_REF) { if (TARGET_MIPS16) @@ -1228,7 +1230,8 @@ mips_classify_symbol (rtx x) if (TARGET_ABICALLS) { - if (SYMBOL_REF_DECL (x) == 0) + decl = SYMBOL_REF_DECL (x); + if (decl == 0) { if (!SYMBOL_REF_LOCAL_P (x)) return SYMBOL_GOT_GLOBAL; @@ -1256,11 +1259,15 @@ mips_classify_symbol (rtx x) In the third case we have more freedom since both forms of access will work for any kind of symbol. However, there seems - little point in doing things differently. */ - if (DECL_P (SYMBOL_REF_DECL (x)) - && TREE_PUBLIC (SYMBOL_REF_DECL (x)) - && !(TARGET_ABSOLUTE_ABICALLS - && targetm.binds_local_p (SYMBOL_REF_DECL (x)))) + little point in doing things differently. + + Note that weakref symbols are not TREE_PUBLIC, but their + targets are global or weak symbols. Relocations in the + object file will be against the target symbol, so it's + that symbol's binding that matters here. */ + if (DECL_P (decl) + && (TREE_PUBLIC (decl) || DECL_WEAK (decl)) + && !(TARGET_ABSOLUTE_ABICALLS && targetm.binds_local_p (decl))) return SYMBOL_GOT_GLOBAL; } -- 2.47.2