|
|
1.1 ! root 1: #!/bin/sh -f ! 2: # Generate a source code listing for C or C++ code with assembler code. The ! 3: # listing is always written to stdout. ! 4: # Author: Igor Metz <[email protected]> ! 5: ! 6: # Revision 1.3 89/12/18 13:58:27 metz ! 7: # lister must now be configured before it can be used. This is done in the ! 8: # /bin/sh part of the code. ! 9: # ! 10: # ! 11: # Revision 1.2 89/08/16 17:35:02 metz ! 12: # Support for SPARC added. ! 13: # ! 14: # Revision 1.1 89/08/16 16:49:22 metz ! 15: # Initial revision ! 16: # ! 17: ! 18: # Requires: gawk (may be it works also with nawk) ! 19: ! 20: # usage: lister filename [compiler-options] ! 21: ! 22: # Method: ! 23: # compile the source with -g option to assembler code, then merge the ! 24: # generated assembler code with the source code. Compiler options ! 25: # can be supplied on the command line (for example -O) ! 26: ! 27: # To install lister, assign one of the supported values to the variable MYSYS: ! 28: # mc68020 for Motorola 68020 (Sun-3, ..) ! 29: # mc68030 for Motorola 68030 (Sun-3, ..) ! 30: # sparc for SPARC (SUN-4, ..) ! 31: # i386 for i386 (Sun i386, ...) ! 32: # i386-linux for i386 (Linux, ...) ! 33: ! 34: # uncomment the line you need: ! 35: # MYSYS=mc68020 ! 36: # MYSYS=mc68030 ! 37: # MYSYS=sparc ! 38: # MYSYS=i386 ! 39: # MYSYS=i386-linux ! 40: # MYSYS=`mach` # this will work on Suns with SunOS > 4.0.0 ! 41: ! 42: FILENAME=$1 ! 43: shift ! 44: ! 45: exec gawk -vsys=$MYSYS -voptions="$*" ' ! 46: # commandline arguments: ! 47: # ARGV[0] = "gawk" ! 48: # ARGV[1] = processid ! 49: # ARGV[2] = filename ! 50: BEGIN { ! 51: if (ARGC != 3) { ! 52: usage() ! 53: exit 1 ! 54: } ! 55: ! 56: # Declaration of global variables ! 57: c_filename = "" ! 58: asm_filename = "" ! 59: cmdline = "" ! 60: asm_code = "" ! 61: c_code = "" ! 62: c_lineno = 0 ! 63: oldlineno = 0 ! 64: newlineno = 0 ! 65: ignore_stabd = 0 ! 66: num_of_fields = 0 ! 67: ! 68: # check processor architecture and set sourcecode line_hint accordingly ! 69: if (sys == "sparc" || sys == "i386") { ! 70: line_hint = "^[ \t]*\.stabn.*" ! 71: } ! 72: else if (sys == "mc68020" || sys == "mc68030" || sys == "i386-linux") { ! 73: line_hint = "^[ \t]*\.stabd.*" ! 74: } ! 75: else { ! 76: error("Processor type " sys " is not supported yet, sorry") ! 77: } ! 78: ! 79: parse_cmdline() ! 80: ! 81: printf("compiling %s to asm code\n", c_filename ) > "/dev/stderr" ! 82: ! 83: if (system(cmdline) != 0 ) { ! 84: error("Compilation of " c_filename " failed") ! 85: } ! 86: ! 87: printf("generating listing\n") > "/dev/stderr" ! 88: ! 89: ! 90: while ( getline asm_code < asm_filename > 0 ) { ! 91: if ( (ignore_stabd==0) && (asm_code ~ line_hint)) { ! 92: # source line hint found. Split the line into fields separated by commas. ! 93: # num_of_fields is 4 for sparc, 3 for m68k ! 94: num_of_fields = split(asm_code, fields, ",") ! 95: newlineno = fields[3] + 0 # the line number we are looking for is field 3 ! 96: ! 97: if (newlineno > oldlineno) { ! 98: while ( newlineno > c_lineno ) { ! 99: getline c_code < c_filename ! 100: c_lineno++ ! 101: printf("%4d %s\n", c_lineno, c_code) ! 102: } ! 103: oldlineno = newlineno ! 104: } ! 105: } ! 106: else if ( asm_code ~ ".*Ltext[ \t]*$" ) { ! 107: # filename hint found ! 108: if ( match(asm_code, c_filename)) { ! 109: ignore_stabd = 0 ! 110: } ! 111: else { ! 112: ignore_stabd = 1 ! 113: } ! 114: } ! 115: printf("\t\t\t%s\n", asm_code) ! 116: } ! 117: ! 118: # general cleanup ! 119: system("/bin/rm " asm_filename) ! 120: } ! 121: ! 122: function usage() { ! 123: printf("usage: %s filename compiler-options\n", argv[0]) > "/dev/stderr" ! 124: } ! 125: ! 126: function error(s) { ! 127: printf("error: %s\n", s) > "/dev/stderr" ! 128: exit 1 ! 129: } ! 130: ! 131: function parse_cmdline( i) { ! 132: # construct filenames to use ! 133: asm_filename = "/tmp/lister" ARGV[1] ".s" ! 134: ARGV[1] = "" ! 135: c_filename = ARGV[2] ! 136: ARGV[2] = "" ! 137: ! 138: # construct commandline to use ! 139: if ( match(c_filename, ".C") || match(c_filename, ".cc") ) { ! 140: cmdline = "g++" ! 141: } ! 142: else if (match(c_filename, ".c")) { ! 143: cmdline = "gcc" ! 144: } ! 145: else { ! 146: error("unknown extension for file " c_filename) ! 147: } ! 148: ! 149: cmdline = cmdline " -g -S -o " asm_filename ! 150: ! 151: # now we append the compiler options specified by the user ! 152: cmdline = cmdline " " options ! 153: ! 154: # last but not least: the name of the file to compile ! 155: cmdline = cmdline " " c_filename ! 156: } ! 157: ! 158: ' $$ $FILENAME ! 159:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.