rscobj.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 1,178 行 · 第 1/3 页
C
1,178 行
{
sym_handle sym;
char *name;
char *buff;
import_type kind;
fe_attr attr;
sym = AskForLblSym( label );
if( AskIfRTLabel( label ) ) {
name = AskRTName( (int)sym );
if( _TstStatus( label, WEIRD_PPC_ALIAS ) ) {
objName[ 0 ] = '.';
objName[ 1 ] = '.';
strcpy( &objName[ 2 ], name );
name = &objName[ 0 ];
}
return( name );
}
if( sym != NULL ) {
buff = &objName[ 0 ];
attr = FEAttr( sym );
kind = NORMAL;
if( (attr & FE_INTERNAL) == 0 ) {
if( attr & FE_DLLIMPORT ) {
kind = DLLIMPORT;
} else {
if( _TstStatus( label, WEIRD_PPC_ALIAS ) ) {
objName[ 0 ] = '.';
objName[ 1 ] = '.';
buff = &objName[ 2 ];
}
}
DoOutObjectName( sym, NameGatherer, buff, kind );
return( objName );
}
}
return( NULL );
}
static owl_symbol_handle labelOwlSym( code_lbl *lbl )
/****************************************************/
{
if( lbl->owl_symbol == NULL ) {
lbl->owl_symbol = OWLSymbolInit( owlFile, LabelName( lbl ) );
}
return( lbl->owl_symbol );
}
extern void InitSegDefs( void )
/*********************************/
{
// fixme - should use routines with some error checking
owl_client_funcs funcs = { PutBytes, NULL, NULL, CGAlloc, CGFree };
owl_format format;
owlHandle = OWLInit( &funcs,
#if _TARGET & _TARG_AXP
OWL_CPU_ALPHA
#elif _TARGET & _TARG_PPC
OWL_CPU_PPC
#elif _TARGET & _TARG_MIPS
OWL_CPU_MIPS
#else
#error Unknown RISC target
#endif
);
if( _IsModel( OBJ_ELF ) ) {
format = OWL_FORMAT_ELF;
} else {
format = OWL_FORMAT_COFF;
}
owlFile = OWLFileInit( owlHandle, FEAuxInfo( NULL, SOURCE_NAME ), (owl_client_file)MAGIC_FLAG, format, OWL_FILE_OBJECT );
if( _IsTargetModel( OWL_LOGGING ) ) {
OWLLogEnable( owlFile, (void *)STDOUT_FILENO );
}
codeSection = BACKSEGS;
dataSection = BACKSEGS;
backSectIdx = BACKSEGS;
currSection = NULL;
owlTocSect = NULL;
globalPdata = NULL;
}
extern void DefSegment( seg_id id, seg_attr attr, char *str, uint align, bool use_16 )
/****************************************************************************************/
{
section_def *new;
owl_section_type type;
align = align;
use_16 = use_16;
new = AddSection( id );
if( attr & EXEC ) {
type = OWL_SECTION_CODE;
if( attr & COMDAT ) {
type = OWL_SECTION_COMDAT_CODE;
}
if( codeSection == BACKSEGS ) {
codeSection = id;
if( _IsModel( DBG_DF ) ) {
DFBegCCU( id, NULL );
}
}
} else if( attr & INIT ) {
type = OWL_SECTION_DATA;
if( attr & COMDAT ) {
type = OWL_SECTION_COMDAT_DATA;
}
if( attr & BACK ) {
dataSection = id;
}
} else {
type = OWL_SECTION_BSS;
if( attr & ( COMDAT | COMMON ) ) {
type = OWL_SECTION_COMDAT_BSS;
}
}
new->owl_handle = OWLSectionInit( owlFile, str, type, 16 );
}
extern void OutFileStart( int line )
/*************************************/
{
cue_state info;
char *fname;
if( _IsModel( DBG_DF ) || _IsModel( DBG_CV ) ){
CueFind( line, &info );
line = info.line;
if( info.fno != CurrFNo ){
fname = SrcFNoFind( info.fno );
CurrFNo = info.fno;
OWLFileSymbol( owlFile, fname );
}
}
}
extern void OutFuncStart( code_lbl *label, offset start, cg_linenum line )
/***************************************************************************/
{
cue_state info;
if( _IsModel( DBG_DF ) || _IsModel( DBG_CV ) ){
CueFind( line, &info );
line = info.line;
if( _IsModel( DBG_DF ) ){
if( _IsModel( DBG_LOCALS | DBG_TYPES ) ){
DFLineNum( &info, start );
}
}
}
currSection->func = OWLDebugFuncBegin( currSection->owl_handle,
labelOwlSym( label ), line, start );
currSection->line = line;
currSection->start = line;
}
extern void OutFuncEnd( offset end )
/*************************************/
{
OWLDebugFuncEnd( currSection->func, currSection->line, end );
currSection->func = NULL;
}
extern void OutLineNum( cg_linenum line, bool label_line )
/************************************************************/
{
cue_state info;
offset lc;
label_line = label_line;
lc = OWLTellOffset( currSection->owl_handle );
if( _IsModel( DBG_DF ) || _IsModel( DBG_CV ) ){
CueFind( line, &info );
if( _IsModel( DBG_DF ) ){
if( _IsModel( DBG_LOCALS | DBG_TYPES ) ){
DFLineNum( &info, lc );
}
}else if( _IsModel( DBG_CV ) ){
char *fname;
if( info.fno != CurrFNo ){
fname = SrcFNoFind( info.fno );
CurrFNo = info.fno;
OWLDebugFuncFile( currSection->func, fname );
}
}
line = info.line;
}
if( currSection->start != line ){ // Else we get two func starts
if( currSection->func != NULL ) // FIXME: added check to prevent crashes - MN
OWLDebugFuncLine( currSection->func, line, lc );
currSection->line = line;
}
}
extern char GetMemModel( void )
/*****************************/
{
char model;
if( _IsTargetModel( BIG_CODE ) ) {
if( _IsTargetModel( BIG_DATA ) ) {
if( _IsntTargetModel( CHEAP_POINTER ) ) {
model = 'h';
} else {
model = 'l';
}
} else {
model = 'm';
}
} else if( _IsTargetModel( BIG_DATA ) ) {
model = 'c';
} else {
model = 'f';
}
return( model );
}
extern seg_id DbgSegDef( char *str )
/**********************************/
{
section_def *new;
seg_id id;
id = --backSectIdx;
new = AddSection( id );
new->owl_handle = OWLSectionInit( owlFile, str, OWL_SECTION_DEBUG, 1 );
return( id );
}
extern bool HaveCodeSeg( void )
/*********************************/
{
return( codeSection != BACKSEGS );
}
extern seg_id AskCodeSeg( void )
/********************************/
{
return( codeSection );
}
extern seg_id AskAltCodeSeg( void )
/***********************************/
{
return( codeSection );
}
extern seg_id AskBackSeg( void )
/********************************/
{
return( dataSection );
}
extern seg_id AskOP() {
/***********************/
assert( currSection != NULL );
return( currSection->id );
}
static bool InlineFunction( pointer hdl )
/***************************************************/
{
call_class rtn_class;
aux_handle aux;
if( ( FEAttr( hdl ) & FE_PROC ) == 0 ) return( FALSE );
aux = FEAuxInfo( hdl, AUX_LOOKUP );
if( FEAuxInfo( aux, CALL_BYTES ) != NULL ) return( TRUE );
rtn_class = *(call_class *)FEAuxInfo( aux, CALL_CLASS );
return( rtn_class & MAKE_CALL_INLINE );
}
extern seg_id AskSegID( pointer hdl, cg_class class )
/*********************************************************/
{
switch( class ) {
case CG_FE:
if( InlineFunction( hdl ) ) {
return( AskCodeSeg() );
}
return( FESegID( hdl ) );
case CG_BACK:
return( ((bck_info*)hdl)->seg );
case CG_TBL:
case CG_VTB:
return( AskCodeSeg() );
case CG_CLB:
return( AskAltCodeSeg() );
default:
return( AskBackSeg() );
}
}
extern void ObjBytes( char *buffer, unsigned size )
/*****************************************************/
{
assert( currSection != NULL );
OWLEmitData( currSection->owl_handle, buffer, size );
}
extern bool AskSegBlank( seg_id id )
/**************************************/
{
section_def *sect;
owl_section_type tipe;
sect = FindSection( id );
tipe = OWLTellSectionType( sect->owl_handle );
return( tipe == OWL_SECTION_BSS || tipe == OWL_SECTION_COMDAT_BSS );
}
#define MAX_ALIGN 128
extern void AlignObject( unsigned align )
/*******************************************/
{
offset off;
unsigned mod;
unsigned add;
char buffer[ MAX_ALIGN ];
assert( currSection != NULL );
assert( _IsPowerOfTwo( align ) );
assert( align != 0 );
assert( align <= MAX_ALIGN );
off = OWLTellOffset( currSection->owl_handle );
mod = off & ( align - 1 );
if( mod ) {
add = align - mod;
if( AskSegBlank( currSection->id ) ) {
OWLEmitData( currSection->owl_handle, NULL, add );
} else {
memset( buffer, 0, add );
OWLEmitData( currSection->owl_handle, buffer, add );
}
}
}
extern seg_id SetOP( seg_id seg )
/*********************************/
{
seg_id old;
section_def *new;
if( currSection == NULL ) {
old = (seg_id)-1;
} else {
old = currSection->id;
}
if( seg == (seg_id)-1 ) {
currSection = NULL;
} else {
new = FindSection( seg );
currSection = new;
}
return( old );
}
extern void FlushOP( seg_id id )
/**********************************/
{
section_def *sect;
seg_id old;
owl_section_type tipe;
sect = FindSection( id );
if( _IsModel( DBG_DF ) ){
tipe = OWLTellSectionType( sect->owl_handle );
switch( tipe ){
case OWL_SECTION_INFO:
case OWL_SECTION_DEBUG:
case OWL_SECTION_PDATA:
case OWL_SECTION_COMDAT_DEBUG:
break;
case OWL_SECTION_COMDAT_PDATA:
case OWL_SECTION_CODE:
case OWL_SECTION_DATA:
case OWL_SECTION_BSS:
case OWL_SECTION_COMDAT_CODE:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?