mapio.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 678 行 · 第 1/2 页
C
678 行
}
WriteMapNL( 1 );
XWriteImports();
}
}
static void WriteVerbSeg( void *_seg )
/************************************/
// NYI: completely broken for absolute segments
{
segdata *seg = _seg;
char star;
char bang;
char see;
targ_addr addr;
seg_leader *leader;
if( seg->isdead )
return;
leader = seg->u.leader;
if( leader->class->flags & CLASS_DEBUG_INFO )
return;
WriteFormat( 16, leader->segname );
WriteFormat( 38, leader->class->name );
if( leader->info & SEG_ABSOLUTE ) {
star = '*';
} else {
star = ' ';
}
if( seg->is32bit ) {
bang = '!';
} else {
bang = ' ';
}
if( seg->iscdat ) {
see = 'c';
} else {
see = ' ';
}
addr = leader->seg_addr;
addr.off += seg->a.delta;
WriteFormat( 53, "%a%c%c%c", &addr, star, see, bang );
WriteFormat( 70, "%h", seg->length );
WriteMapNL( 1 );
}
static void WriteVerbMod( mod_entry *mod )
/****************************************/
{
if( mod->modinfo & MOD_NEED_PASS_2 && mod->segs != NULL ) {
WriteFormat( 0, mod->name );
Ring2Walk( mod->segs, WriteVerbSeg );
}
}
extern void WriteModSegs( void )
/******************************/
{
WriteModSegHead();
WalkMods( WriteVerbMod );
}
static bool CheckSymRecList( void *_info, void *sym )
/***************************************************/
{
symrecinfo *info = _info;
return( ( sym == info->sym ) && ( CurrMod == info->mod ) );
}
static void AddSymRecList( symbol *sym, symrecinfo **head )
/*********************************************************/
{
symrecinfo * info;
if( RingLookup( *head, CheckSymRecList, sym ) == NULL ) {
_ChkAlloc( info, sizeof( symrecinfo ) );
info->next = NULL;
info->sym = sym;
info->mod = CurrMod;
RingAppend( head, info );
}
}
extern void ProcUndefined( symbol *sym )
/***************************************/
{
if( ( LinkFlags & UNDEFS_ARE_OK ) == 0 )
LinkState |= LINK_ERROR;
AddSymRecList( sym, &UndefList );
}
extern void RecordTracedSym( symbol *sym )
/****************************************/
{
if( sym->mod != CurrMod ) {
AddSymRecList( sym, &SymTraceList );
}
}
static void PrintUndefined( void *_info )
/***************************************/
{
symrecinfo *info = _info;
mod_entry * mod;
mod = info->mod;
LnkMsg( YELL+MSG_UNDEF_SYM, "12S", mod->f.source->file->name, mod->name,
info->sym );
WriteFormat( 0, "%S", info->sym );
WriteFormat( 32, "%s(%s)", mod->f.source->file->name, mod->name );
WriteMapNL( 1 );
}
static void PrintSymTrace( void *_info )
/**************************************/
{
symrecinfo * info = _info;
LnkMsg( MAP+MSG_MOD_TRACE, "Ss", info->sym, info->mod->name );
}
extern void WriteUndefined( void )
/********************************/
{
if( SymTraceList != NULL ) {
WriteBox( MSG_MAP_BOX_TRACE_SYM );
RingWalk( SymTraceList, PrintSymTrace );
WriteMapNL( 1 );
}
if( UndefList != NULL ) {
WriteBox( MSG_MAP_BOX_UNRES_REF );
Msg_Write_Map( MSG_MAP_TITLE_UNRES_REF_0 );
Msg_Write_Map( MSG_MAP_TITLE_UNRES_REF_1 );
WriteMapNL( 1 );
RingWalk( UndefList, PrintUndefined );
}
if( LinkState & UNDEFED_SYM_ERROR ) {
LinkState |= LINK_ERROR;
}
}
extern void FreeUndefs( void )
/****************************/
{
RingFree( &SymTraceList );
RingFree( &UndefList );
}
static void Write32( char *s, unsigned_32 size )
/**********************************************/
{
unsigned_16 lo;
if( size <= 0xffff ) {
lo = size & 0xffff;
WriteMap( "%s %x (%d.)", s, lo, lo );
} else {
WriteMap( "%s %h (%l.)", s, size, size );
}
}
extern void WriteLibsUsed( void )
/*******************************/
{
file_list * lib;
char * name;
char * path_ptr;
char new_name[ PATH_MAX ];
if( LinkState & GENERATE_LIB_LIST ) {
WriteBox( MSG_MAP_BOX_LIB_USED );
for( lib = ObjLibFiles; lib != NULL; lib = lib->next_file ) {
if( lib->status & STAT_LIB_USED ) {
name = lib->file->name;
if( lib->file->prefix != NULL ) {
path_ptr = lib->file->prefix;
QMakeFileName( &path_ptr, name, new_name );
name = new_name;
}
WriteMap( "%s", name );
}
}
LinkState &= ~GENERATE_LIB_LIST;
}
}
extern void MapSizes( void )
/**************************/
/*
Write out code size to map file and print libraries used.
*/
{
char msg_buff[RESOURCE_MAX_SIZE];
if( UndefList != NULL ) {
WriteMapNL( 1 );
}
WriteImports();
WriteLibsUsed();
WriteBox( MSG_MAP_BOX_LINKER_STAT );
Msg_Get( MSG_MAP_STACK_SIZE, msg_buff );
Write32( msg_buff, StackSize );
Msg_Get( MSG_MAP_MEM_SIZE, msg_buff );
Write32( msg_buff, MemorySize() );
if( FmtData.type & MK_OVERLAYS && FmtData.u.dos.dynamic ) {
Msg_Get( MSG_MAP_OVL_SIZE, msg_buff );
Write32( msg_buff, (unsigned long)AreaSize * 16 );
}
if( !( FmtData.type & MK_NOVELL ) && ( !FmtData.dll || ( FmtData.type & MK_PE ) ) ){
Msg_Write_Map( MSG_MAP_ENTRY_PT_ADDR, &StartInfo.addr );
}
}
extern void EndTime( void )
/*************************/
{
char * ptr;
signed_16 h;
signed_16 m;
signed_16 s;
signed_16 t;
char tim[ 11 + 1 ];
if( MapFlags & MAP_FLAG ) {
ClockTicks = clock() - ClockTicks;
t = (unsigned_16)( ClockTicks % CLOCKS_PER_SEC );
ClockTicks /= CLOCKS_PER_SEC;
s = (unsigned_16)( ClockTicks % 60 );
ClockTicks /= 60;
m = (unsigned_16)( ClockTicks % 60 );
ClockTicks /= 60;
h = (unsigned_16)ClockTicks;
ptr = tim;
if( h > 0 ) {
ptr = PutDec( ptr, h );
*ptr++ = ':';
}
ptr = PutDec( ptr, m );
*ptr++ = ':';
ptr = PutDec( ptr, s );
*ptr++ = '.';
ptr = PutDec( ptr, t );
*ptr = '\0';
Msg_Write_Map( MSG_MAP_LINK_TIME, tim );
}
}
extern void WriteMapNL( unsigned count )
/**************************************/
{
unsigned len;
if( MapFlags & MAP_FLAG ) {
len = strlen( NLSeq );
while( count != 0 ) {
BufWrite( NLSeq, len );
--count;
}
MapCol = 0;
}
}
static unsigned MapPrint( char *str, va_list * args )
/***************************************************/
{
char buff[MAX_MSG_SIZE];
unsigned len;
len = DoFmtStr( buff, MAX_MSG_SIZE, str, args );
BufWrite( buff, len );
return( len );
}
extern void DoWriteMap( char *format, va_list * arglist )
/*******************************************************/
{
if( MapFlags & MAP_FLAG ) {
MapPrint( format, arglist );
WriteMapNL( 1 );
}
}
extern void WriteMap( char *format, ... )
/***************************************/
{
va_list arglist;
va_start( arglist, format );
DoWriteMap( format, &arglist );
}
extern void WriteFormat( int col, char *str, ... )
/************************************************/
{
va_list arglist;
int num;
static char Blanks[]={" "};
if( MapFlags & MAP_FLAG ) {
num = 0;
if( col > MapCol ) {
num = col - MapCol;
} else if( MapCol != 0 ) {
num = 1;
}
MapCol += num;
BufWrite( Blanks, num );
va_start( arglist, str );
MapCol += MapPrint( str, &arglist );
}
}
extern void BufWrite( char *buffer, int len )
/*******************************************/
// write to the map file, buffering the write if buffering is on.
{
int diff;
if( Buffering ) {
diff = BufferSize + len - TokSize;
if( diff >= 0 ) {
memcpy( TokBuff+BufferSize, buffer, len - diff );
QWrite( MapFile, TokBuff, TokSize, MapFName );
BufferSize = diff;
if( diff > 0 ) {
memcpy( TokBuff, buffer + len - diff, diff );
}
} else {
memcpy( TokBuff+BufferSize, buffer, len );
BufferSize += len;
}
} else {
QWrite( MapFile, buffer, len, MapFName );
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?