Merge pull request #411 from pfusik/bss-name-regression

Fix regression of #pragma bss-name
This commit is contained in:
Oliver Schmidt
2017-03-22 13:44:48 +01:00
committed by GitHub
8 changed files with 87 additions and 11 deletions

View File

@@ -242,16 +242,24 @@ static void Parse (void)
Error ("Variable `%s' has unknown size", Decl.Ident);
}
Entry->Flags &= ~(SC_STORAGE | SC_DEF);
} else {
/* A global (including static) uninitialized variable
** is only a tentative definition. For example, this is valid:
** int i;
** int i;
** static int j;
** static int j = 42;
** Code for these will be generated in FinishCompile.
** For now, just save the BSS segment name
** (can be set with #pragma bss-name)
*/
const char* bssName = GetSegName (SEG_BSS);
if (Entry->V.BssName && strcmp (Entry->V.BssName, bssName) != 0) {
Error ("Global variable `%s' has already been defined in `%s' segment",
Entry->Name, Entry->V.BssName);
}
Entry->V.BssName = xstrdup (bssName);
}
/* A global (including static) uninitialized variable
** is only a tentative definition. For example, this is valid:
** int i;
** int i;
** static int j;
** static int j = 42;
** Code for these will be generated in FinishCompile.
*/
}
}
@@ -418,6 +426,8 @@ void FinishCompile (void)
} else if ((Entry->Flags & (SC_STORAGE | SC_DEF | SC_STATIC)) == (SC_STORAGE | SC_STATIC)) {
/* Tentative definition of uninitialized global variable */
g_usebss ();
SetSegName (SEG_BSS, Entry->V.BssName);
g_segname (SEG_BSS); /* TODO: skip if same as before */
g_defgloblabel (Entry->Name);
g_res (SizeOf (Entry->Type));
/* Mark as defined, so that it will be exported not imported */

View File

@@ -71,6 +71,7 @@ SymEntry* NewSymEntry (const char* Name, unsigned Flags)
E->Type = 0;
E->Attr = 0;
E->AsmName = 0;
E->V.BssName = 0;
memcpy (E->Name, Name, Len+1);
/* Return the new entry */

View File

@@ -153,6 +153,8 @@ struct SymEntry {
struct LiteralPool* LitPool; /* Literal pool for this function */
} F;
/* Segment name for tentantive global definitions */
const char* BssName;
} V;
char Name[1]; /* Name, dynamically allocated */
};