|
|
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:
33: # uncomment the line you need:
34: # MYSYS=mc68020
35: # MYSYS=mc68030
36: # MYSYS=sparc
37: # MYSYS=i386
38: # MYSYS=`mach` # this will work on Suns with SunOS > 4.0.0
39:
40: exec gawk -vsys=$MYSYS '
41: # commandline arguments:
42: # ARGV[0] = "gawk"
43: # ARGV[1] = processid
44: # ARGV[2] = filename
45: # ARGV[3] .. ARGV[ARGC-1] = compiler options
46: BEGIN {
47: if (ARGC < 3) {
48: usage()
49: exit 1
50: }
51:
52: # Declaration of global variables
53: c_filename = ""
54: asm_filename = ""
55: cmdline = ""
56: asm_code = ""
57: c_code = ""
58: c_lineno = 0
59: oldlineno = 0
60: newlineno = 0
61: ignore_stabd = 0
62: num_of_fields = 0
63:
64: # check processor architecture and set sourcecode line_hint accordingly
65: if (sys == "sparc" || sys == "i386") {
66: line_hint = "^[ \t]*\.stabn.*"
67: }
68: else if (sys == "mc68020" || sys == "mc68030") {
69: line_hint = "^[ \t]*\.stabd.*"
70: }
71: else {
72: error("Processor type " sys " is not supported yet, sorry")
73: }
74:
75: parse_cmdline()
76:
77: printf("compiling %s to asm code\n", c_filename ) > "/dev/stderr"
78:
79: if (system(cmdline) != 0 ) {
80: error("Compilation of " c_filename " failed")
81: }
82:
83: printf("generating listing\n") > "/dev/stderr"
84:
85:
86: while ( getline asm_code < asm_filename > 0 ) {
87: if ( (ignore_stabd==0) && (asm_code ~ line_hint)) {
88: # source line hint found. Split the line into fields seperated by commas.
89: # num_of_fields is 4 for sparc, 3 for m68k
90: num_of_fields = split(asm_code, fields, ",")
91: newlineno = fields[3] + 0 # the line number we are looking for is field 3
92:
93: if (newlineno > oldlineno) {
94: while ( newlineno > c_lineno ) {
95: getline c_code < c_filename
96: c_lineno++
97: printf("%4d %s\n", c_lineno, c_code)
98: }
99: oldlineno = newlineno
100: }
101: }
102: else if ( asm_code ~ ".*Ltext[ \t]*$" ) {
103: # filename hint found
104: if ( match(asm_code, c_filename)) {
105: ignore_stabd = 0
106: }
107: else {
108: ignore_stabd = 1
109: }
110: }
111: printf("\t\t\t%s\n", asm_code)
112: }
113:
114: # general cleanup
115: system("/bin/rm " asm_filename)
116: }
117:
118: function usage() {
119: printf("usage: %s filename compiler-options\n", argv[0]) > "/dev/stderr"
120: }
121:
122: function error(s) {
123: printf("error: %s\n", s) > "/dev/stderr"
124: exit 1
125: }
126:
127: function parse_cmdline( i) {
128: # construct filenames to use
129: asm_filename = "/tmp/lister" ARGV[1] ".s"
130: ARGV[1] = ""
131: c_filename = ARGV[2]
132: ARGV[2] = ""
133:
134: # construct commandline to use
135: if ( match(c_filename, ".C") || match(c_filename, ".cc") ) {
136: cmdline = "g++"
137: }
138: else if (match(c_filename, ".c")) {
139: cmdline = "gcc"
140: }
141: else {
142: error("unknown extension for file " c_filename)
143: }
144:
145: cmdline = cmdline " -g -S -o " asm_filename
146:
147: # now we append the compiler options specified by the user
148: for (i = 3; i < ARGC; i++) {
149: cmdline = cmdline " " ARGV[i]
150: ARGV[i] = "" # we do not want to treat it as an inputfile
151: }
152:
153: # last but not least: the name of the file to compile
154: cmdline = cmdline " " c_filename
155: }
156:
157: ' $$ $*
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.