aliasgen.c
来自「开放源码的编译器open watcom 1.6.0版的源代码」· C语言 代码 · 共 557 行 · 第 1/2 页
C
557 行
/*
* Make an ix86 assembler file defining the alias.
*/
static void make_asm_ix86( FILE *miffile, struct Alias *alias, char *outdir )
/***************************************************************************/
{
char filename[_MAX_PATH];
FILE * asmfile;
/*** Open the assembler file ***/
sprintf( filename, "%s_i%6s.asm", outdir, alias->filename );
asmfile = fopen( filename, "wt" );
if( asmfile == NULL ) {
FatalError( "Cannot create '%s'.", filename );
}
/*** Write data to it ***/
fprintf( asmfile, "include mdef.inc\n" );
fprintf( asmfile, "alias_function %s, %s\n", alias->aliasname,
alias->realname );
fprintf( asmfile, "end\n" );
if( ferror( asmfile ) ) {
FatalError( "Cannot write to '%s'.", filename );
}
fclose( asmfile );
sprintf( filename, "_i%6s.obj", alias->filename );
update_mif_file( miffile, filename, alias );
}
/*
* Make a PowerPC assembler file defining the alias.
*/
static void make_asm_ppc( FILE *miffile, struct Alias *alias, char *outdir )
/**************************************************************************/
{
char filename[_MAX_PATH];
FILE * asmfile;
/*** Open the assembler file ***/
sprintf( filename, "%s_p%6s.asm", outdir, alias->filename );
asmfile = fopen( filename, "wt" );
if( asmfile == NULL ) {
FatalError( "Cannot create '%s'.", filename );
}
/*** Write data to it ***/
fprintf( asmfile, "\t.text\n" );
fprintf( asmfile, "\t.globl\t%s\n", alias->aliasname );
fprintf( asmfile, "%s:\n", alias->aliasname );
fprintf( asmfile, "\tb\t%s\n", alias->realname );
if( ferror( asmfile ) ) {
FatalError( "Cannot write to '%s'.", filename );
}
fclose( asmfile );
sprintf( filename, "_p%6s.obj", alias->filename );
update_mif_file( miffile, filename, alias );
}
/*
* Make a MIPS assembler file defining the alias.
*/
static void make_asm_mips( FILE *miffile, struct Alias *alias, char *outdir )
/***************************************************************************/
{
char filename[_MAX_PATH];
FILE * asmfile;
/*** Open the assembler file ***/
sprintf( filename, "%s_m%6s.asm", outdir, alias->filename );
asmfile = fopen( filename, "wt" );
if( asmfile == NULL ) {
FatalError( "Cannot create '%s'.", filename );
}
/*** Write data to it ***/
fprintf( asmfile, "\t.text\n" );
fprintf( asmfile, "\t.globl\t%s\n", alias->aliasname );
fprintf( asmfile, "%s:\n", alias->aliasname );
fprintf( asmfile, "\tj\t%s\n", alias->realname );
if( ferror( asmfile ) ) {
FatalError( "Cannot write to '%s'.", filename );
}
fclose( asmfile );
sprintf( filename, "_m%6s.obj", alias->filename );
update_mif_file( miffile, filename, alias );
}
/*
* Create an alias.
*/
static void do_alias( FILE *miffile, struct Alias *alias, char *outdir )
/**********************************************************************/
{
struct Alias aliasaxp;
struct Alias aliasix86;
struct Alias aliasppc;
struct Alias aliasmips;
struct SysElem * syselem;
/*** Initialize the CPU specific aliases ***/
aliasix86.filename = alias->filename;
aliasix86.realname = alias->realname;
aliasix86.aliasname = alias->aliasname;
aliasix86.systems = NULL;
aliasaxp.filename = alias->filename;
aliasaxp.realname = alias->realname;
aliasaxp.aliasname = alias->aliasname;
aliasaxp.systems = NULL;
aliasppc.filename = alias->filename;
aliasppc.realname = alias->realname;
aliasppc.aliasname = alias->aliasname;
aliasppc.systems = NULL;
aliasmips.filename = alias->filename;
aliasmips.realname = alias->realname;
aliasmips.aliasname = alias->aliasname;
aliasmips.systems = NULL;
/*** Separate into groups by CPU type ***/
syselem = alias->systems;
while( syselem != NULL ) {
if( !strcmp( syselem->system, "nta" ) ) { /* AXP */
add_system( &aliasaxp, syselem->system );
} else if( !strcmp( syselem->system, "axp" ) ) { /* AXP */
add_system( &aliasaxp, syselem->system );
} else if( !strcmp( syselem->system, "ntp" ) ) { /* PPC */
add_system( &aliasppc, syselem->system );
} else if( !strcmp( syselem->system, "op" ) ) { /* PPC */
add_system( &aliasppc, syselem->system );
} else if( !strcmp( syselem->system, "lpc" ) ) { /* PPC */
add_system( &aliasppc, syselem->system );
} else if( !strcmp( syselem->system, "ppc" ) ) { /* PPC */
add_system( &aliasppc, syselem->system );
} else if( !strcmp( syselem->system, "lmp" ) ) { /* MIPS */
add_system( &aliasmips, syselem->system );
} else if( !strcmp( syselem->system, "mps" ) ) { /* MIPS */
add_system( &aliasmips, syselem->system );
} else { /* x86 */
add_system( &aliasix86, syselem->system );
}
syselem = syselem->next;
}
/*** Build any necessary assembler files ***/
if( aliasix86.systems != NULL ) {
make_asm_ix86( miffile, &aliasix86, outdir );
}
if( aliasaxp.systems != NULL ) {
make_asm_axp( miffile, &aliasaxp, outdir );
}
if( aliasppc.systems != NULL ) {
make_asm_ppc( miffile, &aliasppc, outdir );
}
if( aliasppc.systems != NULL ) {
make_asm_mips( miffile, &aliasmips, outdir );
}
}
/*
* Handle one line. Returns 0 if at EOF, and a positive value if there's
* more data to handle.
*/
static int do_line( FILE *infile, FILE *miffile, char *outdir )
/*************************************************************/
{
static int curline;
char line[1024];
char * p;
int numwords;
char ** words;
struct Alias alias;
int count;
/*** Prepare the next line ***/
p = fgets( line, 1024, infile );
if( p == NULL ) {
if( ferror( infile ) ) {
FatalError( "Error reading line %d", curline );
} else if( feof( infile ) ) {
return( 0 );
} else {
Zoinks();
}
}
if( line[0] == '#' ) {
curline++;
return( 2 ); /* skip comment lines */
}
/*** Extract the individual words ***/
numwords = parse_words( line, NULL );
if( numwords == -1 ) {
FatalError( "Error on line %d", curline );
return( -1 );
}
if( numwords == 0 ) { /* skip blank lines */
curline++;
return( 2 );
}
words = (char **)AllocMem( (numwords+1) * sizeof(char*) );
numwords = parse_words( line, words );
if( numwords < 4 ) {
FatalError( "Error on line %d", curline );
return( -1 );
}
/*** Construct an Alias structure and create the alias ***/
alias.filename = words[0];
alias.realname = words[1];
alias.aliasname = words[2];
alias.systems = NULL;
for( count=3; words[count]!=NULL; count++ ) { /* build system list */
add_system( &alias, words[count] );
}
do_alias( miffile, &alias, outdir );
curline++;
return( 1 );
}
/*
* Program entry point.
*/
int main( int argc, char *argv[] )
/*********************************/
{
FILE * infile;
FILE * miffile;
char * outdir;
int alive = 1;
int rc;
/*** Parse the command line ***/
if( argc != 4 ) {
printf( "Usage: ALIASGEN <alias_file> <output_dir\\> <objects_mif_file>\n" );
return( EXIT_FAILURE );
}
infile = fopen( argv[1], "rt" ); /* open alias file */
if( infile == NULL ) {
FatalError( "Cannot open '%s'.", argv[1] );
}
outdir = argv[2]; /* get output directory */
miffile = fopen( argv[3], "wt" ); /* open objects.mif file */
if( miffile == NULL ) {
FatalError( "Cannot create '%s'.", argv[3] );
}
/*** Handle the alias entries, one by one ***/
while( alive ) {
rc = do_line( infile, miffile, outdir );
switch( rc ) {
case 0: /* ok, but not done */
alive = 0;
break;
case 2: /* comment */
break;
case 1: /* got one more */
fputc( '.', stdout );
fflush( stdout );
break;
default:
Zoinks();
break;
}
}
fputc( '\n', stdout );
return( EXIT_SUCCESS );
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?