--- gcc/listing 2018/04/24 17:55:52 1.1.1.2 +++ gcc/listing 2018/04/24 18:17:58 1.1.1.4 @@ -3,6 +3,9 @@ # listing is always written to stdout. # Author: Igor Metz +# Revision 1.4 94/08/26 13:58:27 coxs +# lister now guesses how to should be configured. Added elf and coff support. +# # Revision 1.3 89/12/18 13:58:27 metz # lister must now be configured before it can be used. This is done in the # /bin/sh part of the code. @@ -29,22 +32,54 @@ # mc68030 for Motorola 68030 (Sun-3, ..) # sparc for SPARC (SUN-4, ..) # i386 for i386 (Sun i386, ...) +# i386-linux for i386 (Linux, ...) -# uncomment the line you need: +# Guess what kind of objects we are creating and thus what type of assembler +# symbols to look for + +ex /tmp/$$.c </dev/null +a +main (){} +. +w +q +END +WD=`pwd` +cd /tmp +gcc -c $$.c +case "`file $$.o`" in +*ELF*) MYSYS=elf ;; +*COFF*|*BCS*) MYSYS=coff ;; +*mc68k*|*M68000*) MYSYS=mc68030 ;; +*SPARC*) MYSYS=sparc ;; +*386*) MYSYS=i386 ;; +esac +rm $$.c $$.o +cd $WD + +# uncomment the line you need if the above guesses incorrectly: # MYSYS=mc68020 # MYSYS=mc68030 # MYSYS=sparc # MYSYS=i386 +# MYSYS=i386-linux # MYSYS=`mach` # this will work on Suns with SunOS > 4.0.0 +# MYSYS=elf +# MYSYS=coff + +WHOAMI=$0 +if [ $# -gt 0 ] ; then +FILENAME=$1 +shift +fi -exec gawk -vsys=$MYSYS ' +exec gawk -v whoami=$WHOAMI -vsys=$MYSYS -voptions="$*" ' # commandline arguments: # ARGV[0] = "gawk" # ARGV[1] = processid # ARGV[2] = filename -# ARGV[3] .. ARGV[ARGC-1] = compiler options BEGIN { - if (ARGC < 3) { + if (ARGC != 3) { usage() exit 1 } @@ -64,9 +99,26 @@ BEGIN { # check processor architecture and set sourcecode line_hint accordingly if (sys == "sparc" || sys == "i386") { line_hint = "^[ \t]*\.stabn.*" + line_field = 3; + line_delimiter = ","; + line_offset = 0; } - else if (sys == "mc68020" || sys == "mc68030") { + else if (sys == "mc68020" || sys == "mc68030" || sys == "i386-linux") { line_hint = "^[ \t]*\.stabd.*" + line_field = 3; + line_delimiter = ","; + line_offset = 0; + } + else if (sys == "elf") { + line_hint = "section.*\.line" + line_field = 3; + line_delimiter = "\t"; + line_offset = 0; + } + else if (sys == "coff") { + line_hint = "^[ \t]*ln" + line_field = 3; + line_delimiter = "\t"; } else { error("Processor type " sys " is not supported yet, sorry") @@ -85,14 +137,15 @@ BEGIN { while ( getline asm_code < asm_filename > 0 ) { if ( (ignore_stabd==0) && (asm_code ~ line_hint)) { + while ( sys == "elf" && (asm_code !~ "word" && asm_code !~ "byte") && + getline asm_code < asm_filename > 0); # source line hint found. Split the line into fields separated by commas. # num_of_fields is 4 for sparc, 3 for m68k - num_of_fields = split(asm_code, fields, ",") - newlineno = fields[3] + 0 # the line number we are looking for is field 3 + num_of_fields = split(asm_code, fields, line_delimiter) + newlineno = fields[line_field] + line_offset; if (newlineno > oldlineno) { - while ( newlineno > c_lineno ) { - getline c_code < c_filename + while ( newlineno > c_lineno && getline c_code < c_filename > 0) { c_lineno++ printf("%4d %s\n", c_lineno, c_code) } @@ -108,6 +161,25 @@ BEGIN { ignore_stabd = 1 } } + else if ( sys == "elf" && asm_code ~ "section.*\.debug" ) { + while ( asm_code !~ "^[ \t]*[.]*previous" && + asm_code !~ "\.popsection" && + getline asm_code < asm_filename > 0 ); + if ( ! (getline asm_code < asm_filename > 0)) break; + } + else if ( sys == "coff" && asm_code ~ "^[ \t]*sdef" ) { + if ( asm_code ~ "\.bf" ) { + while ( asm_code !~ "^[ \t]*line" && + getline asm_code < asm_filename > 0 ) { + num_of_fields = split(asm_code, fields, "\t") + line_offset = fields[line_field] - 1; + } + } + while ( asm_code !~ "^[ \t]*endef" && + getline asm_code < asm_filename > 0 ) { + } + if ( ! (getline asm_code < asm_filename > 0)) break; + } printf("\t\t\t%s\n", asm_code) } @@ -116,7 +188,7 @@ BEGIN { } function usage() { - printf("usage: %s filename compiler-options\n", argv[0]) > "/dev/stderr" + printf("usage: %s filename compiler-options\n", whoami) > "/dev/stderr" } function error(s) { @@ -135,7 +207,7 @@ function parse_cmdline( i) { if ( match(c_filename, ".C") || match(c_filename, ".cc") ) { cmdline = "g++" } - else if (match(c_filename, ".c")) { + else if (match(c_filename, ".c") || match(c_filename, ".i")) { cmdline = "gcc" } else { @@ -145,13 +217,11 @@ function parse_cmdline( i) { cmdline = cmdline " -g -S -o " asm_filename # now we append the compiler options specified by the user - for (i = 3; i < ARGC; i++) { - cmdline = cmdline " " ARGV[i] - ARGV[i] = "" # we do not want to treat it as an inputfile - } + cmdline = cmdline " " options # last but not least: the name of the file to compile cmdline = cmdline " " c_filename } -' $$ $* +' $$ $FILENAME +