/* */
/* */
/* */
-/* (C) 1998-2003 Ullrich von Bassewitz */
-/* Römerstrasse 52 */
-/* D-70794 Filderstadt */
-/* EMail: uz@cc65.org */
+/* (C) 1998-2010, Ullrich von Bassewitz */
+/* Roemerstrasse 52 */
+/* D-70794 Filderstadt */
+/* EMail: uz@cc65.org */
/* */
/* */
/* This software is provided 'as-is', without any expressed or implied */
#include <string.h>
/* common */
+#include "addrsize.h"
#include "check.h"
#include "symdefs.h"
#include "xmalloc.h"
/* ld65 */
-#include "global.h"
+#include "dbgsyms.h"
#include "error.h"
+#include "expr.h"
#include "fileio.h"
+#include "global.h"
#include "objdata.h"
-#include "expr.h"
-#include "dbgsyms.h"
+#include "spool.h"
/* We will collect all debug symbols in the following array and remove
* duplicates before outputing them.
*/
-static DbgSym* DbgSymPool [256];
+static DbgSym* DbgSymPool[256];
-static DbgSym* NewDbgSym (unsigned char Type, ObjData* O)
+static DbgSym* NewDbgSym (unsigned char Type, unsigned char AddrSize, ObjData* O)
/* Create a new DbgSym and return it */
{
/* Allocate memory */
D->Flags = 0;
D->Obj = O;
D->Expr = 0;
- D->Name = 0;
+ D->Name = 0;
D->Type = Type;
+ D->AddrSize = AddrSize;
/* Return the new entry */
return D;
{
/* Create the hash. We hash over the symbol value */
unsigned Hash = ((Val >> 24) & 0xFF) ^
- ((Val >> 16) & 0xFF) ^
- ((Val >> 8) & 0xFF) ^
- ((Val >> 0) & 0xFF);
+ ((Val >> 16) & 0xFF) ^
+ ((Val >> 8) & 0xFF) ^
+ ((Val >> 0) & 0xFF);
/* Check for this symbol */
- DbgSym* Sym = DbgSymPool [Hash];
+ DbgSym* Sym = DbgSymPool[Hash];
while (Sym) {
/* Is this symbol identical? */
- if (strcmp (Sym->Name, D->Name) == 0 && EqualExpr (Sym->Expr, D->Expr)) {
+ if (Sym->Name == D->Name && EqualExpr (Sym->Expr, D->Expr)) {
/* Found */
return Sym;
}
DbgSym* ReadDbgSym (FILE* F, ObjData* O)
/* Read a debug symbol from a file, insert and return it */
{
- unsigned char Type;
- DbgSym* D;
-
- /* Read the type */
- Type = Read8 (F);
+ /* Read the type and address size */
+ unsigned char Type = Read8 (F);
+ unsigned char AddrSize = Read8 (F);
/* Create a new debug symbol */
- D = NewDbgSym (Type, O);
+ DbgSym* D = NewDbgSym (Type, AddrSize, O);
/* Read and assign the name */
- D->Name = GetObjString (O, ReadVar (F));
+ D->Name = MakeGlobalStringId (O, ReadVar (F));
/* Read the value */
- if (IS_EXP_EXPR (Type)) {
+ if (IS_EXP_EXPR (D->Type)) {
D->Expr = ReadExpr (F, O);
} else {
D->Expr = LiteralExpr (Read32 (F), O);
-long GetDbgSymVal (DbgSym* D)
+void ClearDbgSymTable (void)
+/* Clear the debug symbol table */
+{
+ unsigned I;
+ for (I = 0; I < sizeof (DbgSymPool) / sizeof (DbgSymPool[0]); ++I) {
+ DbgSym* Sym = DbgSymPool[I];
+ DbgSymPool[I] = 0;
+ while (Sym) {
+ DbgSym* NextSym = Sym->Next;
+ Sym->Next = 0;
+ Sym = NextSym;
+ }
+ }
+}
+
+
+
+long GetDbgSymVal (const DbgSym* D)
/* Get the value of this symbol */
{
CHECK (D->Expr != 0);
+void PrintDbgSyms (ObjData* O, FILE* F)
+/* Print the debug symbols in a debug file */
+{
+ unsigned I;
+
+ /* Walk through all debug symbols in this module */
+ for (I = 0; I < CollCount (&O->DbgSyms); ++I) {
+
+ long Val;
+
+ /* Get the next debug symbol */
+ DbgSym* D = CollAt (&O->DbgSyms, I);
+
+ /* Get the symbol value */
+ Val = GetDbgSymVal (D);
+
+ /* Lookup this symbol in the table. If it is found in the table, it was
+ * already written to the file, so don't emit it twice. If it is not in
+ * the table, insert and output it.
+ */
+ if (GetDbgSym (D, Val) == 0) {
+
+ /* Emit the debug file line */
+ fprintf (F,
+ "sym\t\"%s\",value=0x%08lX,addrsize=%s,type=%s\n",
+ GetString (D->Name),
+ Val,
+ AddrSizeToStr (D->AddrSize),
+ IS_EXP_LABEL (D->Type)? "label" : "equate");
+
+ /* Insert the symbol into the table */
+ InsertDbgSym (D, Val);
+ }
+ }
+}
+
+
+
void PrintDbgSymLabels (ObjData* O, FILE* F)
/* Print the debug symbols in a VICE label file */
{
unsigned I;
/* Walk through all debug symbols in this module */
- for (I = 0; I < O->DbgSymCount; ++I) {
+ for (I = 0; I < CollCount (&O->DbgSyms); ++I) {
+
+ long Val;
/* Get the next debug symbol */
- DbgSym* D = O->DbgSyms [I];
+ DbgSym* D = CollAt (&O->DbgSyms, I);
+
+ /* Emit this symbol only if it is a label (ignore equates) */
+ if (IS_EXP_EQUATE (D->Type)) {
+ continue;
+ }
/* Get the symbol value */
- long Val = GetDbgSymVal (D);
+ Val = GetDbgSymVal (D);
/* Lookup this symbol in the table. If it is found in the table, it was
* already written to the file, so don't emit it twice. If it is not in
if (GetDbgSym (D, Val) == 0) {
/* Emit the VICE label line */
- fprintf (F, "al %06lX .%s\n", Val, D->Name);
+ fprintf (F, "al %06lX .%s\n", Val, GetString (D->Name));
/* Insert the symbol into the table */
InsertDbgSym (D, Val);
+