aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/darwin.c
diff options
context:
space:
mode:
authorStan Shebs <shebs@apple.com>2001-06-11 18:59:42 +0000
committerStan Shebs <shebs@gcc.gnu.org>2001-06-11 18:59:42 +0000
commit353e51f8e5da990ea163d43b6ce6c828848f4891 (patch)
treea156ad6f58e7cde9a778abfc8c47a4b0604b9243 /gcc/config/darwin.c
parent16f104b32ce13a42aa288b39694a714ad256917a (diff)
downloadgcc-353e51f8e5da990ea163d43b6ce6c828848f4891.zip
gcc-353e51f8e5da990ea163d43b6ce6c828848f4891.tar.gz
gcc-353e51f8e5da990ea163d43b6ce6c828848f4891.tar.bz2
darwin.c (darwin_encode_section_info): Rewrite to simplify and fix coding mistakes.
* darwin.c (darwin_encode_section_info): Rewrite to simplify and fix coding mistakes. From-SVN: r43200
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r--gcc/config/darwin.c55
1 files changed, 33 insertions, 22 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 509ff91..3771579 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -1001,6 +1001,9 @@ darwin_encode_section_info (decl)
{
char code = '\0';
int defined = 0;
+ rtx sym_ref;
+ char *orig_str, *new_str;
+ size_t len, new_len;
if ((TREE_CODE (decl) == FUNCTION_DECL
|| TREE_CODE (decl) == VAR_DECL)
@@ -1014,30 +1017,38 @@ darwin_encode_section_info (decl)
else if (TREE_CODE (decl) == VAR_DECL)
code = (defined ? 'D' : 'd');
- if (code != '\0')
- {
- rtx sym_ref = XEXP (DECL_RTL (decl), 0);
-
- if (*(XSTR (sym_ref, 0)) == '!')
- {
- (XSTR(sym_ref, 0))[1] = code;
- update_non_lazy_ptrs (XSTR (sym_ref, 0));
- return;
- }
-
- {
- size_t len = strlen (XSTR (sym_ref, 0));
- size_t newlen = len + 4;
- char *str = alloca (newlen);
+ if (code == '\0')
+ return;
- str[0] = '!';
- str[1] = code;
- str[2] = '_';
- str[3] = '_';
- memcpy (str + 4, XSTR (sym_ref, 0), len + 1);
+ sym_ref = XEXP (DECL_RTL (decl), 0);
+ orig_str = XSTR (sym_ref, 0);
+ len = strlen (orig_str) + 1;
- XSTR (sym_ref, 0) = ggc_alloc_string (str, newlen);
- }
+ if (orig_str[0] == '!')
+ {
+ /* Already encoded; see if we need to change it. */
+ if (code == orig_str[1])
+ return;
+ /* Yes, tweak a copy of the name and put it in a new string. */
+ new_str = alloca (len);
+ memcpy (new_str, orig_str, len);
+ new_str[1] = code;
+ XSTR (sym_ref, 0) = ggc_alloc_string (new_str, len);
+ /* The non-lazy pointer list may have captured references to the
+ old encoded name, change them. */
+ update_non_lazy_ptrs (XSTR (sym_ref, 0));
+ }
+ else
+ {
+ /* Add the encoding. */
+ new_len = len + 4;
+ new_str = alloca (new_len);
+ new_str[0] = '!';
+ new_str[1] = code;
+ new_str[2] = '_';
+ new_str[3] = '_';
+ memcpy (new_str + 4, orig_str, len);
+ XSTR (sym_ref, 0) = ggc_alloc_string (new_str, new_len);
}
}