vms fixes from Pat Rankin

This commit is contained in:
Ken Raeburn 1995-06-01 22:12:20 +00:00
parent db88e79a6a
commit 58abad7d79
2 changed files with 70 additions and 60 deletions

View File

@ -1,3 +1,11 @@
Wed 31 May 17:49:18 1995 Pat Rankin (rankin@eql.caltech.edu)
* config/obj-vms.c (obj_crawl_symbol_chain): Update *symbolPP
in `else' clause when removing a symbol. Also, revise comments
to match the code.
(vms_write_object_file (GSD symbol loop, case N_DATA)): Never
output symbol definitions for local numeric labels.
Tue May 30 12:31:31 1995 Ken Raeburn <raeburn@cujo.cygnus.com>
* write.c (write_object_file): Check for undefined local dollar

View File

@ -424,57 +424,54 @@ obj_read_begin_hook ()
return;
}
void
void
obj_crawl_symbol_chain (headers)
object_headers *headers;
{
symbolS *symbolP;
symbolS **symbolPP;
int symbol_number = 0;
{ /* crawl symbol table */
register int symbol_number = 0;
symbolPP = &symbol_rootP; /* -> last symbol chain link. */
while ((symbolP = *symbolPP) != NULL)
{
symbolPP = &symbol_rootP; /* -> last symbol chain link. */
while ((symbolP = *symbolPP) != NULL)
resolve_symbol_value (symbolP);
/* OK, here is how we decide which symbols go out into the
brave new symtab. Symbols that do are:
* symbols with no name (stabd's?)
* symbols with debug info in their N_TYPE
* symbols with \1 as their 3rd character (numeric labels)
* "local labels" needed for PIC fixups
Symbols that don't are:
* symbols that are registers
All other symbols are output. We complain if a deleted
symbol was marked external. */
if (!S_IS_REGISTER (symbolP))
{
resolve_symbol_value (symbolP);
/* OK, here is how we decide which symbols go out into the
brave new symtab. Symbols that do are:
* symbols with no name (stabd's?)
* symbols with debug info in their N_TYPE
Symbols that don't are:
* symbols that are registers
* symbols with \1 as their 3rd character (numeric labels)
* "local labels" as defined by S_LOCAL_NAME(name)
if the -L switch was passed to gas.
All other symbols are output. We complain if a deleted
symbol was marked external. */
if (!S_IS_REGISTER (symbolP))
symbolP->sy_number = symbol_number++;
symbolP->sy_name_offset = 0;
symbolPP = &(symbol_next (symbolP));
}
else
{
if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP))
{
symbolP->sy_name_offset = 0;
symbolPP = &(symbol_next (symbolP));
}
else
{
if (S_IS_EXTERNAL (symbolP) || !S_IS_DEFINED (symbolP))
{
as_bad ("Local symbol %s never defined", S_GET_NAME (symbolP));
} /* oops. */
as_bad ("Local symbol %s never defined", S_GET_NAME (symbolP));
} /* oops. */
} /* if this symbol should be in the output */
} /* for each symbol */
}
H_SET_STRING_SIZE (headers, string_byte_count);
H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number);
} /* crawl symbol table */
/* Unhook it from the chain. */
*symbolPP = symbol_next (symbolP);
} /* if this symbol should be in the output */
} /* for each symbol */
H_SET_STRING_SIZE (headers, string_byte_count);
H_SET_SYMBOL_TABLE_SIZE (headers, symbol_number);
} /* obj_crawl_symbol_chain() */
@ -4133,19 +4130,16 @@ VMS_Store_Repeated_Data (Repeat_Count, Pointer, Size, Record_Type)
switch (Size)
{
case 4:
if (Pointer[3] != 0
|| Pointer[2] != 0)
goto do_it;
if (Pointer[3] != 0 || Pointer[2] != 0) break;
/* else FALLTHRU */
case 2:
if (Pointer[1] != 0)
goto do_it;
if (Pointer[1] != 0) break;
/* else FALLTHRU */
case 1:
if (Pointer[0] != 0)
goto do_it;
if (Pointer[0] != 0) break;
/* zero value */
return;
default:
do_it:
break;
}
/*
@ -4859,18 +4853,26 @@ vms_write_object_file (text_siz, data_siz, bss_siz, text_frag_root,
* Local initialized data
*/
case N_DATA:
/*
* Make a VMS data symbol entry
*/
vsp = (struct VMS_Symbol *) xmalloc (sizeof (*vsp));
vsp->Symbol = sp;
vsp->Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz);
vsp->Psect_Index = Data_Psect;
vsp->Psect_Offset = Local_Initialized_Data_Size;
Local_Initialized_Data_Size += vsp->Size;
vsp->Next = VMS_Symbols;
VMS_Symbols = vsp;
sp->sy_obj = vsp;
{
char *sym_name = S_GET_NAME (sp);
/* Always suppress local numeric labels. */
if (!sym_name || strlen (sym_name) <= 2 || sym_name[2] != '\001')
{
/*
* Make a VMS data symbol entry.
*/
vsp = (struct VMS_Symbol *) xmalloc (sizeof (*vsp));
vsp->Symbol = sp;
vsp->Size = VMS_Initialized_Data_Size (sp, text_siz + data_siz);
vsp->Psect_Index = Data_Psect;
vsp->Psect_Offset = Local_Initialized_Data_Size;
Local_Initialized_Data_Size += vsp->Size;
vsp->Next = VMS_Symbols;
VMS_Symbols = vsp;
sp->sy_obj = vsp;
}
}
break;
/*
* Global Text definition