On Mon, Oct 20, 2014 at 10:59 AM, Xinliang David Li <davi...@google.com> wrote: > Perhaps explicitly allowing STRING_CST to go through the large data > check, instead of removing the var-decl check? Do you see other > opcodes that need to be handled too?
I do not see any other opcodes explicitly but the code in ix86_in_large_data_p seemingly handles all opcodes other than FUNCTION_DECL through: if (TREE_CODE (exp) == VAR_DECL && DECL_SECTION_NAME (exp)) { <blah> } else { <blah> } However, I have modified the patch to explicitly check for STRING_CST and I cannot think of any other case where the constant goes into rodata but is not accessed via a VAR_DECL. Also note that TREE_STATIC (decl) is true for STRING_CST. Thanks Sri > > David > > On Mon, Oct 20, 2014 at 10:46 AM, Sriraman Tallam <tmsri...@google.com> wrote: >> On Mon, Oct 20, 2014 at 10:42 AM, Xinliang David Li <davi...@google.com> >> wrote: >>> Why removing the tree_code check? >> >> The actual problem happens because STRING_CSTs (end up in .lrodata) >> are not set a far address as they dont match the VAR_DECL check here. >> Futher, "ix86_in_large_data_p" call has the TREE_CODE check to do the >> right thing so this seems unnecessary & buggy here. >> >> Thanks >> Sri >> >>> >>> David >>> >>> On Mon, Oct 20, 2014 at 10:35 AM, Sriraman Tallam <tmsri...@google.com> >>> wrote: >>>> Hi, >>>> >>>> This patch is under review for trunk GCC : >>>> https://gcc.gnu.org/ml/gcc-patches/2014-10/msg01638.html. >>>> >>>> In the mean time, is this ok for google/gcc-4_9 branch? Without >>>> this, -mcmodel=medium is unusable if .lrodata goes beyond the 2G >>>> boundary. >>>> >>>> Thanks >>>> Sri
Index: config/i386/i386.c =================================================================== --- config/i386/i386.c (revision 216287) +++ config/i386/i386.c (working copy) @@ -41331,7 +41331,7 @@ ix86_encode_section_info (tree decl, rtx rtl, int { default_encode_section_info (decl, rtl, first); - if (TREE_CODE (decl) == VAR_DECL + if ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == STRING_CST) && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)) && ix86_in_large_data_p (decl)) SYMBOL_REF_FLAGS (XEXP (rtl, 0)) |= SYMBOL_FLAG_FAR_ADDR; Index: testsuite/gcc.dg/pr63538.c =================================================================== --- testsuite/gcc.dg/pr63538.c (revision 0) +++ testsuite/gcc.dg/pr63538.c (revision 0) @@ -0,0 +1,14 @@ +/* PR63538 is about not using 64-bit addresses for .lrodata accesses when it + involves STRING_CSTs. */ +/* { dg-do compile { target x86_64-*-* } } */ +/* { dg-options "-O2 -mcmodel=medium -mlarge-data-threshold=0" { target x86_64-*-* } } */ + +#include <stdio.h> + +const char *str = "Hello World"; + +int main() { + printf("str = %p %s\n",str, str); + return 0; +} +/* { dg-final { scan-assembler-not "movl" } } */