aboutsummaryrefslogtreecommitdiff
path: root/gcc/output.h
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2015-04-17 16:23:24 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2015-04-17 09:23:24 -0700
commit96583f22d708d874ca90a012d8587e7ad484faed (patch)
tree4d4f3ff893b00124bbd40bc060454119393ffd45 /gcc/output.h
parentaeebf48a7083e5b64b4ddd9d9fe820dd686f419b (diff)
downloadgcc-96583f22d708d874ca90a012d8587e7ad484faed.zip
gcc-96583f22d708d874ca90a012d8587e7ad484faed.tar.gz
gcc-96583f22d708d874ca90a012d8587e7ad484faed.tar.bz2
Properly handle uninitialized common symbol
Uninitialized common symbol behavior in executables is target and linker dependent. default_binds_local_p_3 is made public and updated to take an argument to indicate if the linker can guarantee that an uninitialized common symbol in the executable will still be defined (through COPY relocation) in the executable. If common symbol is local to executable, default_binds_local_p_3 will treat non-external variable as defined locally. default_binds_local_p_2 is changed to treat common symbol as local for non-PIE binaries. For i386, common symbol is local only for non-PIE binaries. For x86-64, common symbol is local only for non-PIE binaries or linker supports copy reloc in PIE binaries. If a target treats common symbol as local only for non-PIE binaries, it can define TARGET_BINDS_LOCAL_P as default_binds_local_p_2. gcc/ PR target/65780 * output.h (default_binds_local_p_3): New. * varasm.c (default_binds_local_p_3): Make it public. Take an argument to indicate if common symbol may be local. If common symbol may be local, treat non-external variable as defined locally. (default_binds_local_p_2): Pass !flag_pic to default_binds_local_p_3. (default_binds_local_p_1): Pass false to default_binds_local_p_3. * config/i386/i386.c (ix86_binds_local_p): New. (TARGET_BINDS_LOCAL_P): Replace default_binds_local_p_2 with ix86_binds_local_p. gcc/testsuite/ PR target/65780 * gcc.dg/pr65780-1.c: New test. * gcc.dg/pr65780-2.c: Likewise. * gcc.target/i386/pr32219-9.c: Likewise. * gcc.target/i386/pr32219-1.c (xxx): Make it initialized common symbol. * gcc.target/i386/pr64317.c (c): Initialize. From-SVN: r222184
Diffstat (limited to 'gcc/output.h')
-rw-r--r--gcc/output.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/gcc/output.h b/gcc/output.h
index 53e47d0..81d2ad2 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -587,6 +587,7 @@ extern bool default_use_anchors_for_symbol_p (const_rtx);
extern bool default_binds_local_p (const_tree);
extern bool default_binds_local_p_1 (const_tree, int);
extern bool default_binds_local_p_2 (const_tree);
+extern bool default_binds_local_p_3 (const_tree, bool, bool, bool, bool);
extern void default_globalize_label (FILE *, const char *);
extern void default_globalize_decl_name (FILE *, tree);
extern void default_emit_unwind_label (FILE *, tree, int, int);