On Wed, Feb 18, 2015 at 5:18 AM, H.J. Lu <hjl.to...@gmail.com> wrote: > On Sun, Feb 15, 2015 at 06:19:21AM -0800, H.J. Lu wrote: >> Hi, >> >> r220674 exposed a bug in ia64_in_small_data_p. After r220674, COMMON >> symbols binds locally for executables. But ia64_in_small_data_p returns >> true for COMMON symbols which are never in small data section. This patch >> fixes it. OK for trunk? >> >> H.J. >> ---- >> Since COMMON symbols are never in small data section, ia64_in_small_data_p >> should return false for COMMON symbols. >> >> PR target/65064 >> * config/ia64/ia64.c (ia64_in_small_data_p): Return false for >> COMMON symbols. > > > Although common symbols are defined in executables, they aren't in small > data section. But a definition in small data section overrides a common > symbol, which still binds lcoally, and turns a reference to common symbol > to reference to small data section. Even if ia64_in_small_data_p returns > true on common symbols, sdata_symbolic_operand must return false on common
^^^^^^ It should be true. > symbols. Common symbols are assumed to be placed in small data section, > but are accessed as if they are in normal data section so that they won't > cause any relocation overflow. > > Tested by Andreas Schwab <sch...@linux-m68k.org>. OK for trunk? > > Thanks. > > > H.J. > --- > PR target/65064 > * config/ia64/predicates.md (sdata_symbolic_operand): Return false > for common symbols. > > diff --git a/gcc/config/ia64/predicates.md b/gcc/config/ia64/predicates.md > index cba0efe..b550882 100644 > --- a/gcc/config/ia64/predicates.md > +++ b/gcc/config/ia64/predicates.md > @@ -69,7 +69,12 @@ > of constants here. */ > t = SYMBOL_REF_DECL (op); > if (DECL_P (t)) > - t = DECL_SIZE_UNIT (t); > + { > + /* Common symbol isn't placed in small data section. */ > + if (DECL_COMMON (t)) > + return false; > + t = DECL_SIZE_UNIT (t); > + } > else > t = TYPE_SIZE_UNIT (TREE_TYPE (t)); > if (t && tree_fits_shwi_p (t)) -- H.J.