diff options
author | Ken Raeburn <raeburn@cygnus> | 1994-03-15 03:05:24 +0000 |
---|---|---|
committer | Ken Raeburn <raeburn@cygnus> | 1994-03-15 03:05:24 +0000 |
commit | abf434d83d785530093439795acbdc29a44b546d (patch) | |
tree | e9a29659c28f15f7cd7042da6f532a496e6269aa /gas | |
parent | 8304c303d69b0b1d016ca2db13a36842b98ed496 (diff) | |
download | fsf-binutils-gdb-abf434d83d785530093439795acbdc29a44b546d.zip fsf-binutils-gdb-abf434d83d785530093439795acbdc29a44b546d.tar.gz fsf-binutils-gdb-abf434d83d785530093439795acbdc29a44b546d.tar.bz2 |
(VMS_Initialized_Data_Size): Cache symbol values to reduce number of lookups
with S_GET_VALUE. Skip debug symbols to avoid "a really nasty bug". (From
Holger Teutsch, holger@botbso.rhein-main.de.)
(VMS_write_object_file): For "__vt.*" symbols, set S_GET_OTHER field. (Also
from Holger Teutsch.) Watch for a would-be register mask that spans frags.
Diffstat (limited to 'gas')
-rw-r--r-- | gas/config/obj-vms.c | 48 |
1 files changed, 29 insertions, 19 deletions
diff --git a/gas/config/obj-vms.c b/gas/config/obj-vms.c index 835049e..ee3e34c 100644 --- a/gas/config/obj-vms.c +++ b/gas/config/obj-vms.c @@ -3681,7 +3681,9 @@ VMS_Initialized_Data_Size (sp, End_Of_Data) register struct symbol *sp; int End_Of_Data; { - register struct symbol *sp1, *Next_Symbol; + struct symbol *sp1, *Next_Symbol; + /* Cache values to avoid extra lookups. */ + valueT sp_val = S_GET_VALUE (sp), sp1_val, next_val; /* * Find the next symbol @@ -3695,10 +3697,13 @@ VMS_Initialized_Data_Size (sp, End_Of_Data) */ if (S_GET_TYPE (sp1) != N_DATA) continue; + + sp1_val = S_GET_VALUE (sp1); + /* * The symbol must be AFTER this symbol */ - if (S_GET_VALUE (sp1) <= S_GET_VALUE (sp)) + if (sp1_val <= sp_val) continue; /* * We ignore THIS symbol @@ -3715,29 +3720,19 @@ VMS_Initialized_Data_Size (sp, End_Of_Data) * We are a better candidate if we are "closer" * to the symbol */ - if (S_GET_VALUE (sp1) > - S_GET_VALUE (Next_Symbol)) + if (sp1_val > next_val) continue; - /* - * Win: Make this the candidate - */ - Next_Symbol = sp1; - } - else - { - /* - * This is the 1st candidate - */ - Next_Symbol = sp1; } + /* + * Make this the candidate + */ + Next_Symbol = sp1; + next_val = sp1_val; } /* * Calculate its size */ - return (Next_Symbol ? - (S_GET_VALUE (Next_Symbol) - - S_GET_VALUE (sp)) : - (End_Of_Data - S_GET_VALUE (sp))); + return Next_Symbol ? (next_val - sp_val) : (End_Of_Data - sp_val); } /* @@ -4545,6 +4540,9 @@ VMS_write_object_file (text_siz, data_siz, bss_siz, text_frag_root, if (strncmp (S_GET_NAME (sp),"__vt.",5) == 0) { S_GET_RAW_TYPE (sp) = N_UNDF | N_EXT; + S_GET_OTHER (sp) = 1; + /* Is this warning still needed? It sounds like it describes + a compiler bug. Does it? If not, let's dump it. */ as_warn("g++ wrote an extern reference to %s as a routine.", S_GET_NAME (sp)); as_warn("I will fix it, but I hope that it was not really a routine"); @@ -4729,6 +4727,18 @@ VMS_write_object_file (text_siz, data_siz, bss_siz, text_frag_root, * Get the entry mask */ fragP = sp->sy_frag; + + /* If first frag doesn't contain the data, what do we do? + If it's possibly smaller than two bytes, that would + imply that the entry mask is not stored where we're + expecting it. + + If you can find a test case that triggers this, report + it (and tell me what the entry mask field ought to be), + and I'll try to fix it. KR */ + if (fragP->fr_fix < 2) + abort (); + Entry_Mask = (fragP->fr_literal[0] & 0xff) + ((fragP->fr_literal[1] & 0xff) << 8); |