mirror of
https://github.com/cc65/cc65.git
synced 2024-12-25 02:29:52 +00:00
Added line infos
git-svn-id: svn://svn.cc65.org/cc65/trunk@748 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
ea2cf602b0
commit
bfbedfa54b
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -107,6 +107,8 @@ void ObjReadHeader (FILE* Obj, ObjHeader* H, const char* Name)
|
|||||||
H->ExportSize = Read32 (Obj);
|
H->ExportSize = Read32 (Obj);
|
||||||
H->DbgSymOffs = Read32 (Obj);
|
H->DbgSymOffs = Read32 (Obj);
|
||||||
H->DbgSymSize = Read32 (Obj);
|
H->DbgSymSize = Read32 (Obj);
|
||||||
|
H->LineInfoOffs = Read32 (Obj);
|
||||||
|
H->LineInfoSize = Read32 (Obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -129,6 +131,8 @@ void ObjWriteHeader (FILE* Obj, ObjHeader* H)
|
|||||||
Write32 (Obj, H->ExportSize);
|
Write32 (Obj, H->ExportSize);
|
||||||
Write32 (Obj, H->DbgSymOffs);
|
Write32 (Obj, H->DbgSymOffs);
|
||||||
Write32 (Obj, H->DbgSymSize);
|
Write32 (Obj, H->DbgSymSize);
|
||||||
|
Write32 (Obj, H->LineInfoOffs);
|
||||||
|
Write32 (Obj, H->LineInfoSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -200,6 +204,8 @@ void ObjAdd (const char* Name)
|
|||||||
H.SegOffs = LibCopyTo (Obj, H.SegSize) - O->Start;
|
H.SegOffs = LibCopyTo (Obj, H.SegSize) - O->Start;
|
||||||
fseek (Obj, H.FileOffs, SEEK_SET);
|
fseek (Obj, H.FileOffs, SEEK_SET);
|
||||||
H.FileOffs = LibCopyTo (Obj, H.FileSize) - O->Start;
|
H.FileOffs = LibCopyTo (Obj, H.FileSize) - O->Start;
|
||||||
|
fseek (Obj, H.LineInfoOffs, SEEK_SET);
|
||||||
|
H.LineInfoOffs = LibCopyTo (Obj, H.LineInfoSize) - O->Start;
|
||||||
|
|
||||||
/* Calculate the amount of data written */
|
/* Calculate the amount of data written */
|
||||||
O->Size = ftell (NewLib) - O->Start;
|
O->Size = ftell (NewLib) - O->Start;
|
||||||
|
@ -58,6 +58,9 @@ void DbgInfoFile (void)
|
|||||||
unsigned long Size;
|
unsigned long Size;
|
||||||
unsigned long MTime;
|
unsigned long MTime;
|
||||||
|
|
||||||
|
/* Parameters are separated by a comma */
|
||||||
|
ConsumeComma ();
|
||||||
|
|
||||||
/* Name */
|
/* Name */
|
||||||
if (Tok != TOK_STRCON) {
|
if (Tok != TOK_STRCON) {
|
||||||
ErrorSkip (ERR_STRCON_EXPECTED);
|
ErrorSkip (ERR_STRCON_EXPECTED);
|
||||||
@ -90,6 +93,17 @@ void DbgInfoLine (void)
|
|||||||
unsigned Index;
|
unsigned Index;
|
||||||
long LineNum;
|
long LineNum;
|
||||||
|
|
||||||
|
/* If a parameters follow, this is actual line info. If no parameters
|
||||||
|
* follow, the last line info is terminated.
|
||||||
|
*/
|
||||||
|
if (Tok == TOK_SEP) {
|
||||||
|
ClearLineInfo ();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Parameters are separated by a comma */
|
||||||
|
ConsumeComma ();
|
||||||
|
|
||||||
/* The name of the file follows */
|
/* The name of the file follows */
|
||||||
if (Tok != TOK_STRCON) {
|
if (Tok != TOK_STRCON) {
|
||||||
ErrorSkip (ERR_STRCON_EXPECTED);
|
ErrorSkip (ERR_STRCON_EXPECTED);
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
#include "xmalloc.h"
|
#include "xmalloc.h"
|
||||||
|
|
||||||
/* ca65 */
|
/* ca65 */
|
||||||
|
#include "objfile.h"
|
||||||
#include "lineinfo.h"
|
#include "lineinfo.h"
|
||||||
|
|
||||||
|
|
||||||
@ -128,6 +129,14 @@ void GenLineInfo (unsigned FileIndex, unsigned long LineNum)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ClearLineInfo (void)
|
||||||
|
/* Clear the current line info */
|
||||||
|
{
|
||||||
|
CurLineInfo = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void MakeLineInfoIndex (void)
|
void MakeLineInfoIndex (void)
|
||||||
/* Walk over the line info list and make an index of all entries ignoring
|
/* Walk over the line info list and make an index of all entries ignoring
|
||||||
* those with a usage count of zero.
|
* those with a usage count of zero.
|
||||||
@ -145,3 +154,37 @@ void MakeLineInfoIndex (void)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void WriteLineInfo (void)
|
||||||
|
/* Write a list of all line infos to the object file. */
|
||||||
|
{
|
||||||
|
LineInfo* LI;
|
||||||
|
|
||||||
|
/* Tell the object file module that we're about to write line infos */
|
||||||
|
ObjStartLineInfos ();
|
||||||
|
|
||||||
|
/* Check if debug info is requested */
|
||||||
|
if (DbgSyms) {
|
||||||
|
|
||||||
|
/* Write the line info count to the list */
|
||||||
|
ObjWriteVar (LineInfoValid);
|
||||||
|
|
||||||
|
/* Walk through list and write all line infos that have references */
|
||||||
|
LI = LineInfoRoot;
|
||||||
|
while (LI) {
|
||||||
|
if (LI->Usage) {
|
||||||
|
/* Write the source file position */
|
||||||
|
ObjWritePos (&LI->Pos);
|
||||||
|
}
|
||||||
|
LI = LI->Next;
|
||||||
|
}
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
/* No line infos */
|
||||||
|
ObjWriteVar (0);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,6 +51,9 @@
|
|||||||
/* common */
|
/* common */
|
||||||
#include "filepos.h"
|
#include "filepos.h"
|
||||||
|
|
||||||
|
/* ca65 */
|
||||||
|
#include "global.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
@ -95,6 +98,17 @@ LineInfo* UseLineInfo (LineInfo* LI);
|
|||||||
void GenLineInfo (unsigned FileIndex, unsigned long LineNum);
|
void GenLineInfo (unsigned FileIndex, unsigned long LineNum);
|
||||||
/* Generate a new line info */
|
/* Generate a new line info */
|
||||||
|
|
||||||
|
void ClearLineInfo (void);
|
||||||
|
/* Clear the current line info */
|
||||||
|
|
||||||
|
void MakeLineInfoIndex (void);
|
||||||
|
/* Walk over the line info list and make an index of all entries ignoring
|
||||||
|
* those with a usage count of zero.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void WriteLineInfo (void);
|
||||||
|
/* Write a list of all line infos to the object file. */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* End of lineinfo.h */
|
/* End of lineinfo.h */
|
||||||
|
@ -56,6 +56,7 @@
|
|||||||
#include "incpath.h"
|
#include "incpath.h"
|
||||||
#include "instr.h"
|
#include "instr.h"
|
||||||
#include "istack.h"
|
#include "istack.h"
|
||||||
|
#include "lineinfo.h"
|
||||||
#include "listing.h"
|
#include "listing.h"
|
||||||
#include "macro.h"
|
#include "macro.h"
|
||||||
#include "nexttok.h"
|
#include "nexttok.h"
|
||||||
@ -480,6 +481,9 @@ static void CreateObjFile (void)
|
|||||||
/* Write debug symbols if requested */
|
/* Write debug symbols if requested */
|
||||||
WriteDbgSyms ();
|
WriteDbgSyms ();
|
||||||
|
|
||||||
|
/* Write line infos if requested */
|
||||||
|
WriteLineInfo ();
|
||||||
|
|
||||||
/* Write an updated header and close the file */
|
/* Write an updated header and close the file */
|
||||||
ObjClose ();
|
ObjClose ();
|
||||||
}
|
}
|
||||||
@ -636,6 +640,9 @@ int main (int argc, char* argv [])
|
|||||||
SegCheck ();
|
SegCheck ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we didn't have an errors, index the line infos */
|
||||||
|
MakeLineInfoIndex ();
|
||||||
|
|
||||||
/* Dump the data */
|
/* Dump the data */
|
||||||
if (Verbosity >= 2) {
|
if (Verbosity >= 2) {
|
||||||
SymDump (stdout);
|
SymDump (stdout);
|
||||||
|
@ -460,6 +460,7 @@ static void WriteOneSeg (Segment* Seg)
|
|||||||
Fragment* Frag;
|
Fragment* Frag;
|
||||||
Fragment* F;
|
Fragment* F;
|
||||||
unsigned long Size;
|
unsigned long Size;
|
||||||
|
unsigned LineInfoIndex;
|
||||||
|
|
||||||
/* Write the segment name followed by the byte count in this segment */
|
/* Write the segment name followed by the byte count in this segment */
|
||||||
ObjWriteStr (Seg->Name);
|
ObjWriteStr (Seg->Name);
|
||||||
@ -534,6 +535,12 @@ static void WriteOneSeg (Segment* Seg)
|
|||||||
/* Write the file position of this fragment */
|
/* Write the file position of this fragment */
|
||||||
ObjWritePos (&Frag->Pos);
|
ObjWritePos (&Frag->Pos);
|
||||||
|
|
||||||
|
/* Write extra line info for this fragment. Zero is considered
|
||||||
|
* "no line info", so add one to the value.
|
||||||
|
*/
|
||||||
|
LineInfoIndex = Frag->LI? Frag->LI->Index + 1 : 0;
|
||||||
|
ObjWriteVar (LineInfoIndex);
|
||||||
|
|
||||||
/* Next fragment */
|
/* Next fragment */
|
||||||
Frag = Frag->Next;
|
Frag = Frag->Next;
|
||||||
}
|
}
|
||||||
|
@ -113,6 +113,8 @@ static void ObjWriteHeader (void)
|
|||||||
ObjWrite32 (Header.ExportSize);
|
ObjWrite32 (Header.ExportSize);
|
||||||
ObjWrite32 (Header.DbgSymOffs);
|
ObjWrite32 (Header.DbgSymOffs);
|
||||||
ObjWrite32 (Header.DbgSymSize);
|
ObjWrite32 (Header.DbgSymSize);
|
||||||
|
ObjWrite32 (Header.LineInfoOffs);
|
||||||
|
ObjWrite32 (Header.LineInfoSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -370,6 +372,7 @@ void ObjEndDbgSyms (void)
|
|||||||
void ObjStartLineInfos (void)
|
void ObjStartLineInfos (void)
|
||||||
/* Mark the start of the line info section */
|
/* Mark the start of the line info section */
|
||||||
{
|
{
|
||||||
|
Header.LineInfoOffs = ftell (F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -377,6 +380,7 @@ void ObjStartLineInfos (void)
|
|||||||
void ObjEndLineInfos (void)
|
void ObjEndLineInfos (void)
|
||||||
/* Mark the end of the line info section */
|
/* Mark the end of the line info section */
|
||||||
{
|
{
|
||||||
|
Header.LineInfoSize = ftell (F) - Header.LineInfoOffs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -482,9 +482,6 @@ static void DoDbg (void)
|
|||||||
/* Skip the subkey */
|
/* Skip the subkey */
|
||||||
NextTok ();
|
NextTok ();
|
||||||
|
|
||||||
/* Parameters are separated by a comma */
|
|
||||||
ConsumeComma ();
|
|
||||||
|
|
||||||
/* Check the key and dispatch to a handler */
|
/* Check the key and dispatch to a handler */
|
||||||
switch (Key) {
|
switch (Key) {
|
||||||
case 0: DbgInfoFile (); break;
|
case 0: DbgInfoFile (); break;
|
||||||
|
@ -966,6 +966,11 @@ void OutputCodeSeg (const CodeSeg* S, FILE* F)
|
|||||||
OutputCodeEntry (E, F);
|
OutputCodeEntry (E, F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If debug info is enabled, terminate the last line number information */
|
||||||
|
if (DebugInfo) {
|
||||||
|
fprintf (F, "\t.dbg\tline\n");
|
||||||
|
}
|
||||||
|
|
||||||
/* If this is a segment for a function, leave the function */
|
/* If this is a segment for a function, leave the function */
|
||||||
if (S->Func) {
|
if (S->Func) {
|
||||||
fprintf (F, "\n.endproc\n\n");
|
fprintf (F, "\n.endproc\n\n");
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
/* Defines for magic and version */
|
/* Defines for magic and version */
|
||||||
#define LIB_MAGIC 0x7A55616E
|
#define LIB_MAGIC 0x7A55616E
|
||||||
#define LIB_VERSION 0x0008
|
#define LIB_VERSION 0x0009
|
||||||
|
|
||||||
/* Size of an library file header */
|
/* Size of an library file header */
|
||||||
#define LIB_HDR_SIZE 12
|
#define LIB_HDR_SIZE 12
|
||||||
|
@ -46,10 +46,10 @@
|
|||||||
|
|
||||||
/* Defines for magic and version */
|
/* Defines for magic and version */
|
||||||
#define OBJ_MAGIC 0x616E7A55
|
#define OBJ_MAGIC 0x616E7A55
|
||||||
#define OBJ_VERSION 0x0008
|
#define OBJ_VERSION 0x0009
|
||||||
|
|
||||||
/* Size of an object file header */
|
/* Size of an object file header */
|
||||||
#define OBJ_HDR_SIZE 56
|
#define OBJ_HDR_SIZE 64
|
||||||
|
|
||||||
/* Flag bits */
|
/* Flag bits */
|
||||||
#define OBJ_FLAGS_DBGINFO 0x0001 /* File has debug info */
|
#define OBJ_FLAGS_DBGINFO 0x0001 /* File has debug info */
|
||||||
@ -74,6 +74,8 @@ struct ObjHeader_ {
|
|||||||
unsigned long ExportSize; /* 32: Size of export list */
|
unsigned long ExportSize; /* 32: Size of export list */
|
||||||
unsigned long DbgSymOffs; /* 32: Offset to list of debug symbols */
|
unsigned long DbgSymOffs; /* 32: Offset to list of debug symbols */
|
||||||
unsigned long DbgSymSize; /* 32: Size of debug symbols */
|
unsigned long DbgSymSize; /* 32: Size of debug symbols */
|
||||||
|
unsigned long LineInfoOffs; /* 32: Offset to list of line infos */
|
||||||
|
unsigned long LineInfoSize; /* 32: Size of line infos */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -60,6 +60,7 @@ Fragment* NewFragment (unsigned char Type, unsigned long Size, Section* S)
|
|||||||
F->Size = Size;
|
F->Size = Size;
|
||||||
F->Expr = 0;
|
F->Expr = 0;
|
||||||
InitFilePos (&F->Pos);
|
InitFilePos (&F->Pos);
|
||||||
|
F->LI = 0;
|
||||||
F->Type = Type;
|
F->Type = Type;
|
||||||
|
|
||||||
/* Insert the code fragment into the section */
|
/* Insert the code fragment into the section */
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -57,6 +57,7 @@ struct Fragment {
|
|||||||
unsigned long Size; /* Size of data/expression */
|
unsigned long Size; /* Size of data/expression */
|
||||||
struct ExprNode* Expr; /* Expression if FRAG_EXPR */
|
struct ExprNode* Expr; /* Expression if FRAG_EXPR */
|
||||||
FilePos Pos; /* File position in source */
|
FilePos Pos; /* File position in source */
|
||||||
|
struct LineInfo* LI; /* Additional line info */
|
||||||
unsigned char Type; /* Type of fragment */
|
unsigned char Type; /* Type of fragment */
|
||||||
unsigned char LitBuf [1]; /* Dynamically alloc'ed literal buffer */
|
unsigned char LitBuf [1]; /* Dynamically alloc'ed literal buffer */
|
||||||
};
|
};
|
||||||
|
81
src/ld65/lineinfo.c
Normal file
81
src/ld65/lineinfo.c
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* lineinfo.h */
|
||||||
|
/* */
|
||||||
|
/* Source file line info structure */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 2001 Ullrich von Bassewitz */
|
||||||
|
/* Wacholderweg 14 */
|
||||||
|
/* D-70597 Stuttgart */
|
||||||
|
/* EMail: uz@cc65.org */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
|
/* warranty. In no event will the authors be held liable for any damages */
|
||||||
|
/* arising from the use of this software. */
|
||||||
|
/* */
|
||||||
|
/* Permission is granted to anyone to use this software for any purpose, */
|
||||||
|
/* including commercial applications, and to alter it and redistribute it */
|
||||||
|
/* freely, subject to the following restrictions: */
|
||||||
|
/* */
|
||||||
|
/* 1. The origin of this software must not be misrepresented; you must not */
|
||||||
|
/* claim that you wrote the original software. If you use this software */
|
||||||
|
/* in a product, an acknowledgment in the product documentation would be */
|
||||||
|
/* appreciated but is not required. */
|
||||||
|
/* 2. Altered source versions must be plainly marked as such, and must not */
|
||||||
|
/* be misrepresented as being the original software. */
|
||||||
|
/* 3. This notice may not be removed or altered from any source */
|
||||||
|
/* distribution. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* common */
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
/* ld65 */
|
||||||
|
#include "fileio.h"
|
||||||
|
#include "lineinfo.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static LineInfo* NewLineInfo (void)
|
||||||
|
/* Create and return a new LineInfo struct */
|
||||||
|
{
|
||||||
|
/* Allocate memory */
|
||||||
|
LineInfo* LI = xmalloc (sizeof (LineInfo));
|
||||||
|
|
||||||
|
/* Initialize the fields */
|
||||||
|
InitFilePos (&LI->Pos);
|
||||||
|
InitCollection (&LI->Fragments);
|
||||||
|
|
||||||
|
/* Return the new struct */
|
||||||
|
return LI;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LineInfo* ReadLineInfo (FILE* F, ObjData* O)
|
||||||
|
/* Read a line info from a file and return it */
|
||||||
|
{
|
||||||
|
/* Allocate a new LineInfo struct and initialize it */
|
||||||
|
LineInfo* LI = NewLineInfo ();
|
||||||
|
|
||||||
|
/* Read the file position */
|
||||||
|
ReadFilePos (F, &LI->Pos);
|
||||||
|
|
||||||
|
/* Return the new LineInfo */
|
||||||
|
return LI;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
79
src/ld65/lineinfo.h
Normal file
79
src/ld65/lineinfo.h
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
/*****************************************************************************/
|
||||||
|
/* */
|
||||||
|
/* lineinfo.h */
|
||||||
|
/* */
|
||||||
|
/* Source file line info structure */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* (C) 2001 Ullrich von Bassewitz */
|
||||||
|
/* Wacholderweg 14 */
|
||||||
|
/* D-70597 Stuttgart */
|
||||||
|
/* EMail: uz@cc65.org */
|
||||||
|
/* */
|
||||||
|
/* */
|
||||||
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
|
/* warranty. In no event will the authors be held liable for any damages */
|
||||||
|
/* arising from the use of this software. */
|
||||||
|
/* */
|
||||||
|
/* Permission is granted to anyone to use this software for any purpose, */
|
||||||
|
/* including commercial applications, and to alter it and redistribute it */
|
||||||
|
/* freely, subject to the following restrictions: */
|
||||||
|
/* */
|
||||||
|
/* 1. The origin of this software must not be misrepresented; you must not */
|
||||||
|
/* claim that you wrote the original software. If you use this software */
|
||||||
|
/* in a product, an acknowledgment in the product documentation would be */
|
||||||
|
/* appreciated but is not required. */
|
||||||
|
/* 2. Altered source versions must be plainly marked as such, and must not */
|
||||||
|
/* be misrepresented as being the original software. */
|
||||||
|
/* 3. This notice may not be removed or altered from any source */
|
||||||
|
/* distribution. */
|
||||||
|
/* */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef LINEINFO_H
|
||||||
|
#define LINEINFO_H
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* common */
|
||||||
|
#include "coll.h"
|
||||||
|
#include "filepos.h"
|
||||||
|
|
||||||
|
/* ld65 */
|
||||||
|
#include "objdata.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Data */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct LineInfo LineInfo;
|
||||||
|
struct LineInfo {
|
||||||
|
FilePos Pos; /* File position */
|
||||||
|
Collection Fragments; /* Fragments for this line */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*****************************************************************************/
|
||||||
|
/* Code */
|
||||||
|
/*****************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
LineInfo* ReadLineInfo (FILE* F, ObjData* O);
|
||||||
|
/* Read a line info from a file and return it */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* End of lineinfo.h */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -31,6 +31,7 @@ OBJS = bin.o \
|
|||||||
fragment.o \
|
fragment.o \
|
||||||
global.o \
|
global.o \
|
||||||
library.o \
|
library.o \
|
||||||
|
lineinfo.o \
|
||||||
main.o \
|
main.o \
|
||||||
mapfile.o \
|
mapfile.o \
|
||||||
o65.o \
|
o65.o \
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -83,6 +83,8 @@ ObjData* NewObjData (void)
|
|||||||
O->Imports = 0;
|
O->Imports = 0;
|
||||||
O->DbgSymCount = 0;
|
O->DbgSymCount = 0;
|
||||||
O->DbgSyms = 0;
|
O->DbgSyms = 0;
|
||||||
|
O->LineInfoCount = 0;
|
||||||
|
O->LineInfos = 0;
|
||||||
|
|
||||||
/* Link it into the list */
|
/* Link it into the list */
|
||||||
if (ObjLast) {
|
if (ObjLast) {
|
||||||
@ -109,6 +111,7 @@ void FreeObjData (ObjData* O)
|
|||||||
xfree (O->Imports);
|
xfree (O->Imports);
|
||||||
xfree (O->Exports);
|
xfree (O->Exports);
|
||||||
xfree (O->DbgSyms);
|
xfree (O->DbgSyms);
|
||||||
|
xfree (O->LineInfos);
|
||||||
xfree (O);
|
xfree (O);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -74,6 +74,8 @@ struct ObjData {
|
|||||||
struct Import** Imports; /* List of all imports */
|
struct Import** Imports; /* List of all imports */
|
||||||
unsigned DbgSymCount; /* Count of debug symbols */
|
unsigned DbgSymCount; /* Count of debug symbols */
|
||||||
struct DbgSym** DbgSyms; /* List of debug symbols */
|
struct DbgSym** DbgSyms; /* List of debug symbols */
|
||||||
|
unsigned LineInfoCount; /* Count of additional line infos */
|
||||||
|
struct LineInfo** LineInfos; /* List of additional line infos */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -116,3 +118,4 @@ const char* GetSourceFileName (const ObjData* O, unsigned Index);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -47,6 +47,7 @@
|
|||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "exports.h"
|
#include "exports.h"
|
||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
|
#include "lineinfo.h"
|
||||||
#include "objdata.h"
|
#include "objdata.h"
|
||||||
#include "segments.h"
|
#include "segments.h"
|
||||||
#include "objfile.h"
|
#include "objfile.h"
|
||||||
@ -99,6 +100,8 @@ static void ObjReadHeader (FILE* Obj, ObjHeader* H, const char* Name)
|
|||||||
H->ExportSize = Read32 (Obj);
|
H->ExportSize = Read32 (Obj);
|
||||||
H->DbgSymOffs = Read32 (Obj);
|
H->DbgSymOffs = Read32 (Obj);
|
||||||
H->DbgSymSize = Read32 (Obj);
|
H->DbgSymSize = Read32 (Obj);
|
||||||
|
H->LineInfoOffs = Read32 (Obj);
|
||||||
|
H->LineInfoSize = Read32 (Obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -165,6 +168,20 @@ void ObjReadDbgSyms (FILE* F, ObjData* O)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void ObjReadLineInfos (FILE* F, ObjData* O)
|
||||||
|
/* Read the line infos from a file at the current position */
|
||||||
|
{
|
||||||
|
unsigned I;
|
||||||
|
|
||||||
|
O->LineInfoCount = ReadVar (F);
|
||||||
|
O->LineInfos = xmalloc (O->LineInfoCount * sizeof (LineInfo*));
|
||||||
|
for (I = 0; I < O->LineInfoCount; ++I) {
|
||||||
|
O->LineInfos[I] = ReadLineInfo (F, O);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void ObjReadSections (FILE* F, ObjData* O)
|
void ObjReadSections (FILE* F, ObjData* O)
|
||||||
/* Read the section data from a file at the current position */
|
/* Read the section data from a file at the current position */
|
||||||
{
|
{
|
||||||
@ -211,6 +228,10 @@ void ObjAdd (FILE* Obj, const char* Name)
|
|||||||
fseek (Obj, O->Header.DbgSymOffs, SEEK_SET);
|
fseek (Obj, O->Header.DbgSymOffs, SEEK_SET);
|
||||||
ObjReadDbgSyms (Obj, O);
|
ObjReadDbgSyms (Obj, O);
|
||||||
|
|
||||||
|
/* Read the line infos from the object file */
|
||||||
|
fseek (Obj, O->Header.LineInfoOffs, SEEK_SET);
|
||||||
|
ObjReadLineInfos (Obj, O);
|
||||||
|
|
||||||
/* Read the segment list from the object file. This must be last, since
|
/* Read the segment list from the object file. This must be last, since
|
||||||
* the expressions stored in the code may reference segments or imported
|
* the expressions stored in the code may reference segments or imported
|
||||||
* symbols.
|
* symbols.
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -51,6 +51,7 @@
|
|||||||
#include "fileio.h"
|
#include "fileio.h"
|
||||||
#include "fragment.h"
|
#include "fragment.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
#include "lineinfo.h"
|
||||||
#include "segments.h"
|
#include "segments.h"
|
||||||
|
|
||||||
|
|
||||||
@ -253,6 +254,7 @@ Section* ReadSection (FILE* F, ObjData* O)
|
|||||||
while (Size) {
|
while (Size) {
|
||||||
|
|
||||||
Fragment* Frag;
|
Fragment* Frag;
|
||||||
|
unsigned LineInfoIndex;
|
||||||
|
|
||||||
/* Read the fragment type */
|
/* Read the fragment type */
|
||||||
unsigned char Type = Read8 (F);
|
unsigned char Type = Read8 (F);
|
||||||
@ -306,6 +308,17 @@ Section* ReadSection (FILE* F, ObjData* O)
|
|||||||
/* Read the file position of the fragment */
|
/* Read the file position of the fragment */
|
||||||
ReadFilePos (F, &Frag->Pos);
|
ReadFilePos (F, &Frag->Pos);
|
||||||
|
|
||||||
|
/* Read the additional line info and resolve it */
|
||||||
|
LineInfoIndex = ReadVar (F);
|
||||||
|
if (LineInfoIndex) {
|
||||||
|
--LineInfoIndex;
|
||||||
|
CHECK (LineInfoIndex < O->LineInfoCount);
|
||||||
|
/* Point from the fragment to the line info... */
|
||||||
|
Frag->LI = O->LineInfos[LineInfoIndex];
|
||||||
|
/* ...and back from the line info to the fragment */
|
||||||
|
CollAppend (&Frag->LI->Fragments, Frag);
|
||||||
|
}
|
||||||
|
|
||||||
/* Remember the module we had this fragment from */
|
/* Remember the module we had this fragment from */
|
||||||
Frag->Obj = O;
|
Frag->Obj = O;
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 1998-2000 Ullrich von Bassewitz */
|
/* (C) 1998-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000 Ullrich von Bassewitz */
|
/* (C) 2000-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -191,6 +191,9 @@ static unsigned SkipFragment (FILE* F)
|
|||||||
/* Skip the file position of the fragment */
|
/* Skip the file position of the fragment */
|
||||||
ReadFilePos (F, &Pos);
|
ReadFilePos (F, &Pos);
|
||||||
|
|
||||||
|
/* Skip the additional line info */
|
||||||
|
(void) ReadVar (F);
|
||||||
|
|
||||||
/* Return the size */
|
/* Return the size */
|
||||||
return Size;
|
return Size;
|
||||||
}
|
}
|
||||||
@ -388,7 +391,7 @@ void DumpObjFiles (FILE* F, unsigned long Offset)
|
|||||||
/* Read the header */
|
/* Read the header */
|
||||||
ReadObjHeader (F, &H);
|
ReadObjHeader (F, &H);
|
||||||
|
|
||||||
/* Seek to the start of the options */
|
/* Seek to the start of the source files */
|
||||||
FileSeek (F, Offset + H.FileOffs);
|
FileSeek (F, Offset + H.FileOffs);
|
||||||
|
|
||||||
/* Output a header */
|
/* Output a header */
|
||||||
@ -436,7 +439,7 @@ void DumpObjSegments (FILE* F, unsigned long Offset)
|
|||||||
/* Read the header */
|
/* Read the header */
|
||||||
ReadObjHeader (F, &H);
|
ReadObjHeader (F, &H);
|
||||||
|
|
||||||
/* Seek to the start of the options */
|
/* Seek to the start of the segments */
|
||||||
FileSeek (F, Offset + H.SegOffs);
|
FileSeek (F, Offset + H.SegOffs);
|
||||||
|
|
||||||
/* Output a header */
|
/* Output a header */
|
||||||
@ -511,7 +514,7 @@ void DumpObjImports (FILE* F, unsigned long Offset)
|
|||||||
/* Read the header */
|
/* Read the header */
|
||||||
ReadObjHeader (F, &H);
|
ReadObjHeader (F, &H);
|
||||||
|
|
||||||
/* Seek to the start of the options */
|
/* Seek to the start of the imports */
|
||||||
FileSeek (F, Offset + H.ImportOffs);
|
FileSeek (F, Offset + H.ImportOffs);
|
||||||
|
|
||||||
/* Output a header */
|
/* Output a header */
|
||||||
@ -567,7 +570,7 @@ void DumpObjExports (FILE* F, unsigned long Offset)
|
|||||||
/* Read the header */
|
/* Read the header */
|
||||||
ReadObjHeader (F, &H);
|
ReadObjHeader (F, &H);
|
||||||
|
|
||||||
/* Seek to the start of the options */
|
/* Seek to the start of the exports */
|
||||||
FileSeek (F, Offset + H.ExportOffs);
|
FileSeek (F, Offset + H.ExportOffs);
|
||||||
|
|
||||||
/* Output a header */
|
/* Output a header */
|
||||||
@ -633,7 +636,7 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset)
|
|||||||
/* Read the header */
|
/* Read the header */
|
||||||
ReadObjHeader (F, &H);
|
ReadObjHeader (F, &H);
|
||||||
|
|
||||||
/* Seek to the start of the options */
|
/* Seek to the start of the debug syms */
|
||||||
FileSeek (F, Offset + H.DbgSymOffs);
|
FileSeek (F, Offset + H.DbgSymOffs);
|
||||||
|
|
||||||
/* Output a header */
|
/* Output a header */
|
||||||
@ -691,4 +694,54 @@ void DumpObjDbgSyms (FILE* F, unsigned long Offset)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void DumpObjLineInfo (FILE* F, unsigned long Offset)
|
||||||
|
/* Dump the line info from an object file */
|
||||||
|
{
|
||||||
|
ObjHeader H;
|
||||||
|
unsigned Count;
|
||||||
|
unsigned I;
|
||||||
|
|
||||||
|
/* Seek to the header position */
|
||||||
|
FileSeek (F, Offset);
|
||||||
|
|
||||||
|
/* Read the header */
|
||||||
|
ReadObjHeader (F, &H);
|
||||||
|
|
||||||
|
/* Seek to the start of line infos */
|
||||||
|
FileSeek (F, Offset + H.LineInfoOffs);
|
||||||
|
|
||||||
|
/* Output a header */
|
||||||
|
printf (" Line info:\n");
|
||||||
|
|
||||||
|
/* Check if the object file was compiled with debug info */
|
||||||
|
if ((H.Flags & OBJ_FLAGS_DBGINFO) == 0) {
|
||||||
|
/* Print that there no line infos and bail out */
|
||||||
|
printf (" Count:%27u\n", 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Read the number of line infos and print it */
|
||||||
|
Count = ReadVar (F);
|
||||||
|
printf (" Count:%27u\n", Count);
|
||||||
|
|
||||||
|
/* Read and print all line infos */
|
||||||
|
for (I = 0; I < Count; ++I) {
|
||||||
|
|
||||||
|
FilePos Pos;
|
||||||
|
|
||||||
|
/* Read one line info */
|
||||||
|
ReadFilePos (F, &Pos);
|
||||||
|
|
||||||
|
/* Print the header */
|
||||||
|
printf (" Index:%27u\n", I);
|
||||||
|
|
||||||
|
/* Print the data */
|
||||||
|
printf (" Line:%26lu\n", Pos.Line);
|
||||||
|
printf (" Col:%27u\n", Pos.Col);
|
||||||
|
printf (" Name:%26u\n", Pos.Name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000 Ullrich von Bassewitz */
|
/* (C) 2000-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -69,6 +69,9 @@ void DumpObjExports (FILE* F, unsigned long Offset);
|
|||||||
void DumpObjDbgSyms (FILE* F, unsigned long Offset);
|
void DumpObjDbgSyms (FILE* F, unsigned long Offset);
|
||||||
/* Dump the debug symbols from an object file */
|
/* Dump the debug symbols from an object file */
|
||||||
|
|
||||||
|
void DumpObjLineInfo (FILE* F, unsigned long Offset);
|
||||||
|
/* Dump the line infos from an object file */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* End of dump.h */
|
/* End of dump.h */
|
||||||
|
@ -209,6 +209,8 @@ void ReadObjHeader (FILE* F, ObjHeader* H)
|
|||||||
H->ExportSize = Read32 (F);
|
H->ExportSize = Read32 (F);
|
||||||
H->DbgSymOffs = Read32 (F);
|
H->DbgSymOffs = Read32 (F);
|
||||||
H->DbgSymSize = Read32 (F);
|
H->DbgSymSize = Read32 (F);
|
||||||
|
H->LineInfoOffs = Read32 (F);
|
||||||
|
H->LineInfoSize = Read32 (F);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,6 +51,7 @@
|
|||||||
#define D_IMPORTS 0x0010U /* Dump imported symbols */
|
#define D_IMPORTS 0x0010U /* Dump imported symbols */
|
||||||
#define D_EXPORTS 0x0020U /* Dump exported symbols */
|
#define D_EXPORTS 0x0020U /* Dump exported symbols */
|
||||||
#define D_DBGSYMS 0x0040U /* Dump debug symbols */
|
#define D_DBGSYMS 0x0040U /* Dump debug symbols */
|
||||||
|
#define D_LINEINFO 0x0080U /* Dump line infos */
|
||||||
#define D_ALL 0xFFFFU /* Dump anything */
|
#define D_ALL 0xFFFFU /* Dump anything */
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,10 +6,10 @@
|
|||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* (C) 2000 Ullrich von Bassewitz */
|
/* (C) 2000-2001 Ullrich von Bassewitz */
|
||||||
/* Wacholderweg 14 */
|
/* Wacholderweg 14 */
|
||||||
/* D-70597 Stuttgart */
|
/* D-70597 Stuttgart */
|
||||||
/* EMail: uz@musoftware.de */
|
/* EMail: uz@cc65.org */
|
||||||
/* */
|
/* */
|
||||||
/* */
|
/* */
|
||||||
/* This software is provided 'as-is', without any expressed or implied */
|
/* This software is provided 'as-is', without any expressed or implied */
|
||||||
@ -83,6 +83,7 @@ static void Usage (void)
|
|||||||
" --dump-files\t\tDump the source files\n"
|
" --dump-files\t\tDump the source files\n"
|
||||||
" --dump-header\t\tDump the object file header\n"
|
" --dump-header\t\tDump the object file header\n"
|
||||||
" --dump-imports\tDump imported symbols\n"
|
" --dump-imports\tDump imported symbols\n"
|
||||||
|
" --dump-lineinfo\tDump line information\n"
|
||||||
" --dump-options\tDump object file options\n"
|
" --dump-options\tDump object file options\n"
|
||||||
" --dump-segments\tDump the segments in the file\n"
|
" --dump-segments\tDump the segments in the file\n"
|
||||||
" --help\t\tHelp (this text)\n"
|
" --help\t\tHelp (this text)\n"
|
||||||
@ -140,6 +141,14 @@ static void OptDumpImports (const char* Opt, const char* Arg)
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
static void OptDumpLineInfo (const char* Opt, const char* Arg)
|
||||||
|
/* Dump the line infos */
|
||||||
|
{
|
||||||
|
What |= D_LINEINFO;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void OptDumpOptions (const char* Opt, const char* Arg)
|
static void OptDumpOptions (const char* Opt, const char* Arg)
|
||||||
/* Dump the object file options */
|
/* Dump the object file options */
|
||||||
{
|
{
|
||||||
@ -227,6 +236,9 @@ static void DumpFile (const char* Name)
|
|||||||
if (What & D_DBGSYMS) {
|
if (What & D_DBGSYMS) {
|
||||||
DumpObjDbgSyms (F, 0);
|
DumpObjDbgSyms (F, 0);
|
||||||
}
|
}
|
||||||
|
if (What & D_LINEINFO) {
|
||||||
|
DumpObjLineInfo (F, 0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Close the file */
|
/* Close the file */
|
||||||
@ -246,6 +258,7 @@ int main (int argc, char* argv [])
|
|||||||
{ "--dump-files", 0, OptDumpFiles },
|
{ "--dump-files", 0, OptDumpFiles },
|
||||||
{ "--dump-header", 0, OptDumpHeader },
|
{ "--dump-header", 0, OptDumpHeader },
|
||||||
{ "--dump-imports", 0, OptDumpImports },
|
{ "--dump-imports", 0, OptDumpImports },
|
||||||
|
{ "--dump-lineinfo", 0, OptDumpLineInfo },
|
||||||
{ "--dump-options", 0, OptDumpOptions },
|
{ "--dump-options", 0, OptDumpOptions },
|
||||||
{ "--dump-segments", 0, OptDumpSegments },
|
{ "--dump-segments", 0, OptDumpSegments },
|
||||||
{ "--help", 0, OptHelp },
|
{ "--help", 0, OptHelp },
|
||||||
|
Loading…
Reference in New Issue
Block a user