From 353e51f8e5da990ea163d43b6ce6c828848f4891 Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Mon, 11 Jun 2001 18:59:42 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 5 +++++ gcc/config/darwin.c | 55 +++++++++++++++++++++++++++------------------ 2 files changed, 38 insertions(+), 22 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fd65dd5569d..15effda2d70 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2001-06-11 Stan Shebs + + * darwin.c (darwin_encode_section_info): Rewrite to simplify + and fix coding mistakes. + 2001-06-11 Nick Clifton * config/m32r/m32r.md (movstrsi_internal): Do not expect a diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 509ff91262a..37715796cb0 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); } } -- 2.30.2