diff options
author | dje <dje@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-04 01:56:12 +0000 |
---|---|---|
committer | dje <dje@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-09-04 01:56:12 +0000 |
commit | fb5a6c4cbb421bc0fcd1fd9ca51bb47e1f5e8aec (patch) | |
tree | 7ed0cb8380f2dcaa2166c1420cbbe9f9f8f3eeb0 /gcc | |
parent | faf773c4057a8495d3e009b0c716e10b3dd1f5c1 (diff) | |
download | gcc-fb5a6c4cbb421bc0fcd1fd9ca51bb47e1f5e8aec.tar.gz |
* varasm.c (default_section_type_flags): Append _1 to name with
shlib parameter. Use original name to call new function with
implicit flag_pic.
(decl_readonly_section): Likewise.
(default_elf_select_section): Likewise.
(default_unique_section): Likewise.
(default_bind_local_p): Likewise.
(categorize_decl_for_section): Add shlib parameter to use in place
of implicit flag_pic.
* output.h: Declare new functions with _1 and shlib argument.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@56780 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/output.h | 8 | ||||
-rw-r--r-- | gcc/varasm.c | 72 |
3 files changed, 81 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 96555f460fc..81db01b1e23 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2002-09-03 David Edelsohn <edelsohn@gnu.org> + + * varasm.c (default_section_type_flags): Append _1 to name with + shlib parameter. Use original name to call new function with + implicit flag_pic. + (decl_readonly_section): Likewise. + (default_elf_select_section): Likewise. + (default_unique_section): Likewise. + (default_bind_local_p): Likewise. + (categorize_decl_for_section): Add shlib parameter to use in place + of implicit flag_pic. + * output.h: Declare new functions with _1 and shlib argument. + 2002-09-03 Janis Johnson <janis187@us.ibm.com> * doc/install.texi: Fix typos, formatting problems, and obvious diff --git a/gcc/output.h b/gcc/output.h index fadf5f8e6dc..bbacd310456 100644 --- a/gcc/output.h +++ b/gcc/output.h @@ -468,6 +468,7 @@ extern rtx this_is_asm_operands; /* Decide whether DECL needs to be in a writable section. RELOC is the same as for SELECT_SECTION. */ extern bool decl_readonly_section PARAMS ((tree, int)); +extern bool decl_readonly_section_1 PARAMS ((tree, int, int)); /* User label prefix in effect for this compilation. */ extern const char *user_label_prefix; @@ -508,6 +509,9 @@ extern bool named_section_first_declaration PARAMS((const char *)); union tree_node; extern unsigned int default_section_type_flags PARAMS ((union tree_node *, const char *, int)); +extern unsigned int default_section_type_flags_1 PARAMS ((union tree_node *, + const char *, + int, int)); extern void default_no_named_section PARAMS ((const char *, unsigned int)); extern void default_elf_asm_named_section PARAMS ((const char *, unsigned int)); @@ -530,13 +534,17 @@ extern void default_select_section PARAMS ((tree, int, unsigned HOST_WIDE_INT)); extern void default_elf_select_section PARAMS ((tree, int, unsigned HOST_WIDE_INT)); +extern void default_elf_select_section_1 PARAMS ((tree, int, + unsigned HOST_WIDE_INT, int)); extern void default_unique_section PARAMS ((tree, int)); +extern void default_unique_section_1 PARAMS ((tree, int, int)); extern void default_select_rtx_section PARAMS ((enum machine_mode, rtx, unsigned HOST_WIDE_INT)); extern void default_elf_select_rtx_section PARAMS ((enum machine_mode, rtx, unsigned HOST_WIDE_INT)); extern const char *default_strip_name_encoding PARAMS ((const char *)); extern bool default_binds_local_p PARAMS ((tree)); +extern bool default_binds_local_p_1 PARAMS ((tree, int)); extern void default_globalize_label PARAMS ((FILE *, const char *)); /* Emit data for vtable gc for GNU binutils. */ diff --git a/gcc/varasm.c b/gcc/varasm.c index b3ea8aa1c85..e84a2891153 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -4691,11 +4691,21 @@ default_section_type_flags (decl, name, reloc) const char *name; int reloc; { + return default_section_type_flags_1 (decl, name, reloc, flag_pic); +} + +unsigned int +default_section_type_flags_1 (decl, name, reloc, shlib) + tree decl; + const char *name; + int reloc; + int shlib; +{ unsigned int flags; if (decl && TREE_CODE (decl) == FUNCTION_DECL) flags = SECTION_CODE; - else if (decl && decl_readonly_section (decl, reloc)) + else if (decl && decl_readonly_section_1 (decl, reloc, shlib)) flags = 0; else flags = SECTION_WRITE; @@ -4913,12 +4923,14 @@ enum section_category SECCAT_TBSS }; -static enum section_category categorize_decl_for_section PARAMS ((tree, int)); +static enum section_category +categorize_decl_for_section PARAMS ((tree, int, int)); static enum section_category -categorize_decl_for_section (decl, reloc) +categorize_decl_for_section (decl, reloc, shlib) tree decl; int reloc; + int shlib; { enum section_category ret; @@ -4940,16 +4952,16 @@ categorize_decl_for_section (decl, reloc) || TREE_SIDE_EFFECTS (decl) || ! TREE_CONSTANT (DECL_INITIAL (decl))) { - if (flag_pic && (reloc & 2)) + if (shlib && (reloc & 2)) ret = SECCAT_DATA_REL; - else if (flag_pic && reloc) + else if (shlib && reloc) ret = SECCAT_DATA_REL_LOCAL; else ret = SECCAT_DATA; } - else if (flag_pic && (reloc & 2)) + else if (shlib && (reloc & 2)) ret = SECCAT_DATA_REL_RO; - else if (flag_pic && reloc) + else if (shlib && reloc) ret = SECCAT_DATA_REL_RO_LOCAL; else if (flag_merge_constants < 2) /* C and C++ don't allow different variables to share the same @@ -4963,7 +4975,7 @@ categorize_decl_for_section (decl, reloc) } else if (TREE_CODE (decl) == CONSTRUCTOR) { - if ((flag_pic && reloc) + if ((shlib && reloc) || TREE_SIDE_EFFECTS (decl) || ! TREE_CONSTANT (decl)) ret = SECCAT_DATA; @@ -4999,7 +5011,16 @@ decl_readonly_section (decl, reloc) tree decl; int reloc; { - switch (categorize_decl_for_section (decl, reloc)) + return decl_readonly_section_1 (decl, reloc, flag_pic); +} + +bool +decl_readonly_section_1 (decl, reloc, shlib) + tree decl; + int reloc; + int shlib; +{ + switch (categorize_decl_for_section (decl, reloc, shlib)) { case SECCAT_RODATA: case SECCAT_RODATA_MERGE_STR: @@ -5021,7 +5042,17 @@ default_elf_select_section (decl, reloc, align) int reloc; unsigned HOST_WIDE_INT align; { - switch (categorize_decl_for_section (decl, reloc)) + default_elf_select_section_1 (decl, reloc, align, flag_pic); +} + +void +default_elf_select_section_1 (decl, reloc, align, shlib) + tree decl; + int reloc; + unsigned HOST_WIDE_INT align; + int shlib; +{ + switch (categorize_decl_for_section (decl, reloc, shlib)) { case SECCAT_TEXT: /* We're not supposed to be called on FUNCTION_DECLs. */ @@ -5085,12 +5116,21 @@ default_unique_section (decl, reloc) tree decl; int reloc; { + default_unique_section_1 (decl, reloc, flag_pic); +} + +void +default_unique_section_1 (decl, reloc, shlib) + tree decl; + int reloc; + int shlib; +{ bool one_only = DECL_ONE_ONLY (decl); const char *prefix, *name; size_t nlen, plen; char *string; - switch (categorize_decl_for_section (decl, reloc)) + switch (categorize_decl_for_section (decl, reloc, shlib)) { case SECCAT_TEXT: prefix = one_only ? ".gnu.linkonce.t." : ".text."; @@ -5205,6 +5245,14 @@ bool default_binds_local_p (exp) tree exp; { + return default_binds_local_p_1 (exp, flag_pic); +} + +bool +default_binds_local_p_1 (exp, shlib) + tree exp; + int shlib; +{ bool local_p; /* A non-decl is an entry in the constant pool. */ @@ -5224,7 +5272,7 @@ default_binds_local_p (exp) local_p = false; /* If PIC, then assume that any global name can be overridden by symbols resolved from other modules. */ - else if (flag_pic) + else if (shlib) local_p = false; /* Uninitialized COMMON variable may be unified with symbols resolved from other modules. */ |