jm36+@ANDREW.CMU.EDU (John Gardiner Myers) (10/16/88)
Gcc version:
gcc version 1.30
/afs/andrew.cmu.edu/usr0/cl0x/lib/gcc/@sys/gcc-cc1 poly.i -quiet -g -version
-o poly.s
GNU C version 1.30 (68k, MIT syntax) compiled by GNU C version 1.30.
Command arguments: gcc -v -g -S poly.i
Run on a Sun3 running SunOS 3.5. md is m68k.md, tm.h is tm-sun3.h
Behavior:
The address of the buffer where the return value (a struct) is placed in
register d2, but for some inputs (e.g. "%\n/") d2 is clobbered before it is
used.
Input file:
-----
extern struct _iobuf {
int _cnt;
unsigned char *_ptr;
unsigned char *_base;
int _bufsiz;
short _flag;
char _file;
} _iob[];
extern struct _iobuf *fopen();
extern struct _iobuf *fdopen();
extern struct _iobuf *freopen();
extern struct _iobuf *popen();
extern struct _iobuf *tmpfile();
extern long ftell();
extern char *fgets();
extern char *gets();
extern char *ctermid();
extern char *cuserid();
extern char *tempnam();
extern char *tmpnam();
extern int errno, signgam;
extern double fmod(), gamma();
extern int matherr();
extern double asinh(), acosh(), atanh();
extern double erf(), erfc();
extern double exp(), expm1(), log(), log10(), log1p(), pow();
extern double fabs(), floor(), ceil(), rint();
extern double lgamma();
extern double hypot(), cabs();
extern double copysign(), drem(), logb(), scalb();
extern int finite();
extern double j0(), j1(), jn(), y0(), y1(), yn();
extern double sin(), cos(), tan(), asin(), acos(), atan(), atan2();
extern double sinh(), cosh(), tanh();
extern double cbrt(), sqrt();
extern double modf(), ldexp(), frexp(), atof();
struct exception {
int type;
char *name;
double arg1;
double arg2;
double retval;
};
typedef int jmp_buf[15];
char *strcat();
char *strncat();
int strcmp();
int strncmp();
char *strcpy();
char *strncpy();
int strlen();
char *index();
char *rindex();
typedef struct dict_struct *Type;
typedef struct object
{
int flags;
Type type;
int Length;
union
{
int Integer, Boolean, Font;
float Real;
Type Dictionary;
unsigned char *String;
struct name_struct *Name;
struct op_struct *Operator;
struct file_struct *File;
struct object *Array;
} u;
} Object;
enum file_type { StringFile, StreamFile };
struct file_struct
{
enum file_type file_type;
int available;
union
{
unsigned char *c_ptr;
struct _iobuf *f_ptr;
} f;
};
struct dict_entry
{
Object entry_key, entry_value;
};
struct dict_struct
{
int dict_flags, dict_size, dict_fill;
struct dict_entry *dict_body;
};
typedef struct stack
{
int stack_fill, stack_size;
Object overflow, underflow, *stack_body;
} *Stack, StackOb;
Object NoAccess ();
Object SameFlags (), MakeObject (), Cvx (), Cvlit (), ReadOnly (), WriteOnly
(), ExecOnly ();
int OpCheck (), min (), rCheck (), wCheck (), xCheck ();
Object MakeArray (), ParseArray (), getArray (), getIArray (), *BodyArray ();
Object MakeBoolean ();
Object MakeDict (), DictLoad (), Lookup (), DictFrom (), Load ();
Type MakeType (), TypeOf (), BodyDict ();
extern int EqTrue (), Equal ();
Object FileFrom (), FileString ();
int Getch ();
struct file_struct *BodyFile ();
Object MakeInteger (), IntReal ();
Object ParseNumber ();
float Deg (), Rad ();
Object ParseId (), NameFrom (), MakeName (), Cvn (), StringName ();
unsigned char *BodyName ();
Object MakeOp (), NameOperator ();
Object Parse ();
int PolyFirst (), PolySecond (), PolyThird (), PolyPair ();
Object MakeReal (), RealInteger ();
float BodyReal (), BodyFloat ();
char *Malloc ();
Object Pop (), Top (), Where (), DictLookup ();
int Push ();
extern Object MakeString (), StringFrom (), getIString (), ParseString (),
ParseHexString ();
unsigned char *BodyString ();
int lengthString ();
extern Object PDictFull;
extern Object PDictOverflow, PInvFont, PSyntaxError;
extern Object PDictUnderflow, PInvRestore, PTypeCheck;
extern Object PExecOverflow, PIOError, PUndefined;
extern Object PExecUnderflow, PLimitCheck, PUnFilename;
extern Object PInterrupt, PNoCurrentPoint, PUnResult;
extern Object PInvAccess, PRangeCheck, PUnMatched;
extern Object PInvExit, POpOverflow, PUnregistered;
extern Object PInvFileAccess, POpUnderflow, PVMError;
extern Type Boolean, Mark, String, Real, Poly, Operator;
extern Type Name, File, Dictionary, Condition, Null, Integer;
extern Type Array, Mark, Condition, Null, Float, FontID;
extern Object SysDict, Absent, Nil;
extern Object True, False, Marker, Self;
extern Object OpInterp, Lbracket, Rbracket;
extern Object StatementEdit, Fstdin, Fstdout, Fstderr;
extern Stack OpStack, ExecStack, DictStack;
extern jmp_buf env;
extern int interactive, verbose;
extern char default_library[], *library;
extern unsigned char *Bcopy ();
extern struct _iobuf *vfp, *Fopen ();
extern void Fclose ();
extern int getchbuf;
Object DictFind();
static int Copy ();
int PolyFirst (), PolySecond (), PolyThird (), PolyPair ();
Object Parse (f) Object f;
{
Object res;
int c;
for (;;)
switch (c = (( ( ((f).u.File)->available != 0) &&
((f).u.File)->file_type == StreamFile) ? ((getchbuf = (--(
((f).u.File)->f.f_ptr)->_cnt>=0? ((int)*(
((f).u.File)->f.f_ptr)->_ptr++):_filbuf( ((f).u.File)->f.f_ptr))), ((getchbuf
!= (-1)) ? getchbuf : (( ((f).u.File)->available = 0), Close (f), (-1)))) :
GeneralGetch (f)))
{
default: Ungetch (f, c);
res = ParseId (f);
if ( ((res).type) == Integer || ((res).type) == Real)
return res;
else
return Cvx (res);
case '/': return ParseId (f);
case '{': return Cvx (ParseArray (f));
case '}': return True;
case '[': return Lbracket;
case ']': return Rbracket;
case '<': return ParseHexString (f);
case '(': return ParseString (f);
case ')': return Absent;
case (-1): return False;
case ' ':
case '\t':
case '\n':
continue;
case '%':
while ((c = (( ( ((f).u.File)->available != 0) &&
((f).u.File)->file_type == StreamFile) ? ((getchbuf = (--(
((f).u.File)->f.f_ptr)->_cnt>=0? ((int)*(
((f).u.File)->f.f_ptr)->_ptr++):_filbuf( ((f).u.File)->f.f_ptr))), ((getchbuf
!= (-1)) ? getchbuf : (( ((f).u.File)->available = 0), Close (f), (-1)))) :
GeneralGetch (f))) != '\n' && c != (-1))
;
Ungetch (f, c);
continue;
}
}
------
Annotated output:
------
#NO_APP
.stabs "poly.i",100,0,0,Ltext
Ltext:
.stabs "int:t1=r1;-2147483648;2147483647;",128,0,0,0
.stabs "char:t2=r2;0;127;",128,0,0,0
.stabs "long int:t3=r1;-2147483648;2147483647;",128,0,0,0
.stabs "unsigned int:t4=r1;0;-1;",128,0,0,0
.stabs "long unsigned int:t5=r1;0;-1;",128,0,0,0
.stabs "short int:t6=r1;-32768;32767;",128,0,0,0
.stabs "long long int:t7=r1;0;-1;",128,0,0,0
.stabs "short unsigned int:t8=r1;0;65535;",128,0,0,0
.stabs "long long unsigned int:t9=r1;0;-1;",128,0,0,0
.stabs "signed char:t10=r1;-128;127;",128,0,0,0
.stabs "unsigned char:t11=r1;0;255;",128,0,0,0
.stabs "float:t12=r1;4;0;",128,0,0,0
.stabs "double:t13=r1;8;0;",128,0,0,0
.stabs "long double:t14=r1;8;0;",128,0,0,0
.stabs "void:t15=15",128,0,0,0
.stabs "exception:T16=s32type:1,0,32;name:17=*2,32,32;\\",128,0,0,0
.stabs "arg1:13,64,64;arg2:13,128,64;retval:13,192,64;;",128,0,0,0
.stabs "_iobuf:T18=s20_cnt:1,0,32;_ptr:19=*11,32,32;\\",128,0,0,0
.stabs "_base:19,64,32;_bufsiz:1,96,32;_flag:6,128,16;\\",128,0,0,0
.stabs "_file:2,144,8;;",128,0,0,0
.stabs "jmp_buf:t20=ar1;0;14;1",128,0,0,0
.stabs "Type:t21=*22=xsdict_struct:",128,0,0,0
.stabs "object:T23=s16flags:1,0,32;type:21,32,32;\\",128,0,0,0
.stabs "Length:1,64,32;u:24=u4Integer:1,0,32;\\",128,0,0,0
.stabs "Boolean:1,0,32;Font:1,0,32;Real:12,0,32;\\",128,0,0,0
.stabs
"Dictionary:21,0,32;String:19,0,32;Name:25=*26=xsname_struct:,0,32;\\",128,0,
0,0
.stabs
"Operator:27=*28=xsop_struct:,0,32;File:29=*30=xsfile_struct:,0,32;\\",128,0,
0,0
.stabs "Array:31=*23,0,32;;,96,32;;",128,0,0,0
.stabs "Object:t23",128,0,0,0
.stabs "stack:T32=s44stack_fill:1,0,32;stack_size:1,32,32;\\",128,0,0,0
.stabs
"overflow:23,64,128;underflow:23,192,128;stack_body:31,320,32;;",128,0,0,0
.stabs "dict_entry:T33=s32entry_key:23,0,128;entry_value:23,128,128;;",128,0,0,0
.stabs "file_type:T34=eStringFile:0,StreamFile:1,;",128,0,0,0
.stabs "file_struct:T30=s12file_type:34,0,32;available:1,32,32;\\",128,0,0,0
.stabs "f:35=u4c_ptr:19,0,32;f_ptr:36=*18,0,32;;,64,32;;",128,0,0,0
.stabs "dict_struct:T22=s16dict_flags:1,0,32;dict_size:1,32,32;\\",128,0,0,0
.stabs "dict_fill:1,64,32;dict_body:37=*33,96,32;;",128,0,0,0
.stabs "Stack:t38=*32",128,0,0,0
.stabs "StackOb:t32",128,0,0,0
.text
.even
.globl _Parse
_Parse:
.stabd 68,0,165
link a6,#-20
moveml #0x3000,sp@-
movel a1,d2 <<<<< d2 initialized w/addr of return struct.
LBB2:
.stabd 68,0,170
L2:
.stabd 68,0,171
movel a6@(20),a0
tstl a0@(4)
jeq L32
movel a6@(20),a0
moveq #1,d1
cmpl a0@,d1
jne L32
movel a6@(20),a0
movel a0@(8),a0
subql #1,a0@
tstl a0@
jlt L34
movel a6@(20),a0
movel a0@(8),d0
movel d0,d0
movel d0,a0
addqw #4,a0
movel a0@,a1
clrl d0
moveb a1@,d0
movel d0,_getchbuf
addql #1,a0@
jra L35
L34:
movel a6@(20),a0
movel a0@(8),sp@-
jbsr __filbuf
addqw #4,sp
movel d0,_getchbuf
L35:
moveq #-1,d1
cmpl _getchbuf,d1
jeq L36
movel _getchbuf,d3
jra L37
L36:
movel a6@(20),a0
clrl a0@(4)
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
jbsr _Close
addw #16,sp
moveq #-1,d3
L37:
jra L33
L32:
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
jbsr _GeneralGetch
addw #16,sp
movel d0,d3
L33:
movel d3,d0
movel d0,a6@(-20)
addql #1,d0
moveq #126,d1
cmpl d1,d0
jhi L6
LI31:
movew pc@(L31-LI31-2:b,d0:l:2),d0
jmp pc@(2,d0:w)
L31:
.word L18-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L20-L31
.word L21-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L19-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L22-L31
.word L6-L31
.word L6-L31
.word L16-L31
.word L17-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L10-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L15-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L13-L31
.word L6-L31
.word L14-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L6-L31
.word L11-L31
.word L6-L31
.word L12-L31
L6:
.stabd 68,0,173
movel a6@(-20),sp@-
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
jbsr _Ungetch
.stabd 68,0,174
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
moveq #-16,d0
addl a6,d0
movel d0,a1
jbsr _ParseId
.stabd 68,0,175
addw #36,sp
movel a6@(-12),d1
cmpl _Integer,d1
jeq L8
cmpl _Real,d1
jeq L8
jra L7
L8:
.stabd 68,0,176
lea a6@(-16),a0
movel d2,a1 <<<<< d2 used as addr of return struct.
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
jra L1
jra L9
L7:
.stabd 68,0,178
movel a6,a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
movel d2,a1 <<<<< d2 used as addr of return struct.
jbsr _Cvx
jra L1
L9:
L10:
.stabd 68,0,180
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
movel d2,a1 <<<<< d2 used as addr of return struct. (etc)
jbsr _ParseId
jra L1
L11:
.stabd 68,0,181
subw #16,sp
movel sp,d0
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
movel d0,a1
jbsr _ParseArray
addw #16,sp
movel d2,a1
jbsr _Cvx
jra L1
L12:
.stabd 68,0,182
lea _True,a0
movel d2,a1
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
jra L1
L13:
.stabd 68,0,183
lea _Lbracket,a0
movel d2,a1
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
jra L1
L14:
.stabd 68,0,184
lea _Rbracket,a0
movel d2,a1
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
jra L1
L15:
.stabd 68,0,185
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
movel d2,a1
jbsr _ParseHexString
jra L1
L16:
.stabd 68,0,186
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
movel d2,a1
jbsr _ParseString
jra L1
L17:
.stabd 68,0,187
lea _Absent,a0
movel d2,a1
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
jra L1
L18:
.stabd 68,0,189
lea _False,a0
movel d2,a1
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
movel a0@,a1@
addqw #4,a1
addqw #4,a0
jra L1
L19:
L20:
L21:
.stabd 68,0,195
jra L4
L22:
.stabd 68,0,198
L23:
movel a6@(20),a0
tstl a0@(4)
jeq L25
movel a6@(20),a0
moveq #1,d1
cmpl a0@,d1
jne L25
movel a6@(20),a0
movel a0@(8),a0
subql #1,a0@
tstl a0@
jlt L27
movel a6@(20),a0
movel a0@(8),d0
movel d0,d0
movel d0,a0
addqw #4,a0
movel a0@,a1
clrl d0
moveb a1@,d0
movel d0,_getchbuf
addql #1,a0@
jra L28
L27:
movel a6@(20),a0
movel a0@(8),sp@-
jbsr __filbuf
addqw #4,sp
movel d0,_getchbuf
L28:
moveq #-1,d1
cmpl _getchbuf,d1
jeq L29
movel _getchbuf,d2 <<<<< d2 Clobbered
jra L30
L29:
movel a6@(20),a0
clrl a0@(4)
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
jbsr _Close
addw #16,sp
moveq #-1,d2
L30:
jra L26
L25:
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
jbsr _GeneralGetch
addw #16,sp
movel d0,d2
L26:
movel d2,d0
movel d0,a6@(-20)
moveq #10,d1
cmpl d0,d1
jeq L24
moveq #-1,d1
cmpl a6@(-20),d1
jeq L24
jra L23
L24:
.stabd 68,0,200
movel a6@(-20),sp@-
lea a6@(24),a0
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
subql #4,a0
movel a0@,sp@-
jbsr _Ungetch
.stabd 68,0,201
addw #20,sp
jra L4
L5:
.stabd 68,0,170
L4:
jra L2
L3:
LBE2:
.stabd 68,0,203
L1:
moveml a6@(-28),#0xc
unlk a6
rts
.stabs "Parse:F23",36,0,0,_Parse
.stabs "f:p23",160,0,0,8
.stabs "c:1",128,0,0,-20
.stabn 192,0,0,LBB2
.stabn 224,0,0,LBE2