shithub: rgbds

Download patch

ref: 92449a4fe4f13a8e45f0589985351b80a45fa941
parent: 4e2a035838630e736111af8235370e12e51a6170
author: Antonio Niño Díaz <[email protected]>
date: Sat Jul 22 11:16:38 EDT 2017

Save object file name of each symbol in linker

This is useful to generate error messages when there is a symbol that
appears in more than one object file.

Signed-off-by: Antonio Niño Díaz <[email protected]>

--- a/include/link/mylink.h
+++ b/include/link/mylink.h
@@ -89,6 +89,7 @@
 	SLONG nSectionID;	/* internal to object.c */
 	struct sSection *pSection;
 	SLONG nOffset;
+	char *pzObjFileName; /* Object file where the symbol is located. */
 	char *pzFileName; /* Source file where the symbol was defined. */
 	ULONG nFileLine; /* Line where the symbol was defined. */
 };
--- a/include/link/symbol.h
+++ b/include/link/symbol.h
@@ -4,7 +4,8 @@
 #include "types.h"
 
 void sym_Init(void);
-void sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank);
+void sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank,
+			char *tzObjFileName, char *tzFileName, ULONG nFileLine);
 SLONG sym_GetValue(char *tzName);
 SLONG sym_GetBank(char *tzName);
 
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -566,16 +566,21 @@
 			    ((pSect->tSymbols[i]->pSection == pSect) ||
 				(pSect->tSymbols[i]->pSection == NULL))) {
 				if (pSect->tSymbols[i]->pSection == NULL)
-					sym_CreateSymbol(pSect->tSymbols[i]->
-					    pzName,
-					    pSect->tSymbols[i]->
-					    nOffset, -1);
+					sym_CreateSymbol(
+						pSect->tSymbols[i]->pzName,
+						pSect->tSymbols[i]->nOffset,
+						-1,
+						pSect->tSymbols[i]->pzObjFileName,
+						pSect->tSymbols[i]->pzFileName,
+						pSect->tSymbols[i]->nFileLine);
 				else
-					sym_CreateSymbol(pSect->tSymbols[i]->
-					    pzName,
-					    pSect->nOrg +
-					    pSect->tSymbols[i]->
-					    nOffset, pSect->nBank);
+					sym_CreateSymbol(
+						pSect->tSymbols[i]->pzName,
+						pSect->nOrg + pSect->tSymbols[i]->nOffset,
+						pSect->nBank,
+						pSect->tSymbols[i]->pzObjFileName,
+						pSect->tSymbols[i]->pzFileName,
+						pSect->tSymbols[i]->nFileLine);
 			}
 		}
 		pSect = pSect->pNext;
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -116,7 +116,7 @@
  */
 
 struct sSymbol *
-obj_ReadSymbol(FILE * f)
+obj_ReadSymbol(FILE * f, char *tzObjectfile)
 {
 	struct sSymbol *pSym;
 
@@ -128,6 +128,8 @@
 	readasciiz(&pSym->pzName, f);
 	pSym->Type = (enum eSymbolType)fgetc(f);
 
+	pSym->pzObjFileName = tzObjectfile;
+
 	if (pSym->Type != SYM_IMPORT) {
 		readasciiz(&pSym->pzFileName, f);
 		pSym->nFileLine = readlong(f);
@@ -268,7 +270,7 @@
 }
 
 void
-obj_ReadRGB(FILE * pObjfile)
+obj_ReadRGB(FILE * pObjfile, char *tzObjectfile)
 {
 	struct sSection *pFirstSection;
 	SLONG nNumberOfSymbols, nNumberOfSections, i;
@@ -285,7 +287,7 @@
 		}
 
 		for (i = 0; i < nNumberOfSymbols; i += 1)
-			tSymbols[i] = obj_ReadSymbol(pObjfile);
+			tSymbols[i] = obj_ReadSymbol(pObjfile, tzObjectfile);
 	} else
 		tSymbols = (struct sSymbol **) & dummymem;
 
@@ -337,7 +339,7 @@
 	if (strncmp(tzHeader, "RGB", 3) == 0) {
 		switch (tzHeader[3]) {
 		case '5':
-			obj_ReadRGB(pObjfile);
+			obj_ReadRGB(pObjfile, tzObjectfile);
 			break;
 		default:
 			errx(1, "'%s' uses an unsupported object file version (%s). Please reassemble it.", tzObjectfile, tzHeader);
--- a/src/link/symbol.c
+++ b/src/link/symbol.c
@@ -12,8 +12,10 @@
 struct ISymbol {
 	char *pzName;
 	SLONG nValue;
-	SLONG nBank;
-	    //-1 = const
+	SLONG nBank; /* -1 = constant */
+	char tzObjFileName[_MAX_PATH + 1]; /* Object file where the symbol was defined. */
+	char tzFileName[_MAX_PATH + 1]; /* Source file where the symbol was defined. */
+	ULONG nFileLine; /* Line where the symbol was defined. */
 	struct ISymbol *pNext;
 };
 
@@ -76,7 +78,8 @@
 }
 
 void
-sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank)
+sym_CreateSymbol(char *tzName, SLONG nValue, SLONG nBank, char *tzObjFileName,
+		char *tzFileName, ULONG nFileLine)
 {
 	if (strcmp(tzName, "@") == 0)
 		return;
@@ -102,6 +105,11 @@
 			(*ppSym)->nValue = nValue;
 			(*ppSym)->nBank = nBank;
 			(*ppSym)->pNext = NULL;
+			strncpy((*ppSym)->tzObjFileName, tzObjFileName,
+				sizeof((*ppSym)->tzObjFileName));
+			strncpy((*ppSym)->tzFileName, tzFileName,
+				sizeof((*ppSym)->tzFileName));
+			(*ppSym)->nFileLine = nFileLine;
 		}
 	}
 }