west@turing.toronto.edu (Tom West) (01/22/91)
I have a problem with both MPW C compiler 3.1 and 3.2b3q101. Both will
occasionally allocate vast amounts of space for structures that should
only take a few bytes. An example of a program fragment is provided
below. (I tried to cut it down to a small complete program, but the
problem kept disappearing.) Does anyone know anything about this bug?
Below, in the program fragment, kindToAssignOpOffset is a static array
19 bytes long. It's allocated over 23k!! Likewise, kindToAssignInverted
should be 38 bytes and is likewise allocated 23 or so k. I've included the
code fragment where they're declared, the fragment from the MAP file
produced by the link, and fragments from the DUMPOBJ file where they
are mentioned. It's clear from line 60952 and line 61032 of the DUMPOBJ file
that the C compiler is what is messing up.
Can anybody help? i.e. confirm the bug exists, suggest a work around, etc.
P.S. Apologies for the code, it is, as might be guessed, computer generated.
Tom West
tomwest@gpu.utcs.toronto.edu
west@turing.toronto.edu
west@hsa.on.ca
The C Code:
-----------
typedef short Compile_Opcode;
...
void Compile_Coder_Assign (op, tTarget, tSource)
Compile_Tok op;
struct Compile_TyDef *tTarget;
struct Compile_TyDef *tSource;
{
register struct Compile_TyDef *t;
register unsigned short realKind;
typedef Compile_Opcode __x2504[19];
static __x2504 kindToAssign =
{40, 51, 39, 52, 52, 52, 40, 50, 48, 48,
48, 40, 107, 49, 107, 107, 107, 107, 40};
typedef char __x2505[19];
static __x2505 kindToAssignOpOffset = <-- Offending Structure
{0, 2, -1, -2, -2, -2, 0, 1, -1, -1,
-1, 3, -1, -1, -1, -1, -1, -1, 1};
...
}
...
void Compile_Coder_AssignInverted (ty)
struct Compile_TyDef *ty;
{
register struct Compile_TyDef *t;
typedef Compile_Opcode __x2515[19];
static __x2515 kindToAssignInverted = <-- Offending Structure
{42, 46, 41, 47, 47, 107, 42, 45, 43, 43,
43, 42, 107, 44, 107, 107, 107, 107, 42};
...
}
...
Map File Produced When Linking:
-------------------------------
...
Segment "%GlobalData" size=$1778E
...
GEOpcode -$16ABE(A5) size=$0026 local hasContents
LEOpcode -$16A98(A5) size=$0026 local hasContents
EQOpcode -$16A72(A5) size=$0026 local hasContents
kindToAssignInverted -$16A4C(A5) size=$5C92 local hasContents
^^^^^
kindToAssignOpOffset -$10DBA(A5) size=$5EA6 local hasContents
^^^^^
kindToAssign -$AF14(A5) size=$0042 local hasContents
kindToFetch -$AED2(A5) size=$06C2 local hasContents
...
DumpObj Output:
---------------
...
10750: Dictionary: Flags $00 FirstId 8351
10750: 8351: kindToAssignOpOffset
10777: Pad
...
10834: Dictionary: Flags $80 (SymbolicIDs) FirstId 8353
10834: 8353: __x2505
10848: LocalID: Flags $00 RecordSize=22 parentID=8333 FileID="coder.c"(1) FileOffset=42232
LocalID="kindToAssignOpOffset"(8351) Type="__x2505"(8353) FF:0 FileOffset=42232
Kind=(StorageClass=A5_Relative offsetSize=32bit) Offset(ID)="kindToAssignOpOffset"(51)
...
11192: Dictionary: Flags $00 FirstId 8363
11192: 8363: kindToAssignInverted
11219: Pad
...
11276: Dictionary: Flags $80 (SymbolicIDs) FirstId 8365
11276: 8365: __x2515
11290: LocalID: Flags $00 RecordSize=22 parentID=8357 FileID="coder.c"(1) FileOffset=43863
LocalID="kindToAssignInverted"(8363) Type="__x2515"(8365) FF:0 FileOffset=43863
Kind=(StorageClass=A5_Relative offsetSize=32bit) Offset(ID)="kindToAssignInverted"(54)
...
37606: Reference: Flags=$90=(A5Relative 16BitPatch 16BitOffsets FromCode)
Ref="kindToAssignOpOffset"(51)
000E
37614: Content: Flags $08
37614: Contents offset $0000 size $0132
00000000: 4E56 FFFE 'NV..' LINK A6,#$FFFE
00000004: 48E7 0718 'H...' MOVEM.L D5-D7/A3/A4,-(A7)
00000008: 1A2E 000B '....' MOVE.B $000B(A6),D5
0000000C: 47ED 0000 'G...' LEA kindToAssignOpOffset,A3 ; id: 51
00000010: 286E 000C '(n..' MOVEA.L $000C(A6),A4
00000014: 700E 'p.' MOVEQ #$0E,D0
...
38260: Reference: Flags=$90=(A5Relative 16BitPatch 16BitOffsets FromCode)
Ref="kindToAssignInverted"(54)
0028
38268: Content: Flags $08
38268: Contents offset $0000 size $00A8
00000000: 4E56 0000 'NV..' LINK A6,#$0000
00000004: 48E7 0118 'H...' MOVEM.L D7/A3/A4,-(A7)
00000008: 266E 0008 '&n..' MOVEA.L $0008(A6),A3
0000000C: 284B '(K' MOVEA.L A3,A4
0000000E: 700E 'p.' MOVEQ #$0E,D0
00000010: B06C 0006 '.l..' CMP.W $0006(A4),D0
00000014: 660A 'f.' BNE.S *+$000C ; 00000020
00000016: 2F0C '/.' MOVE.L A4,-(A7)
00000018: 4EBA 0000 'N...' JSR Compile_Coder_UnOpaque ; id: 35
0000001C: 2840 '(@' MOVEA.L D0,A4
0000001E: 588F 'X.' ADDQ.L #$4,A7
00000020: 302C 0006 '0,..' MOVE.W $0006(A4),D0
00000024: D040 '.@' ADD.W D0,D0
00000026: 41ED 0000 'A...' LEA kindToAssignInverted,A0 ; id: 54
0000002A: 3E30 0000 '>0..' MOVE.W $00(A0,D0.W),D7
0000002E: 3007 '0.' MOVE.W D7,D0
00000030: 48C0 'H.' EXT.L D0
00000032: 2F00 '/.' MOVE.L D0,-(A7)
00000034: 4EBA 0000 'N...' JSR Compile_Coder_NoOperands ; id: 17
00000038: 7000 'p.' MOVEQ #$00,D0
0000003A: 3007 '0.' MOVE.W D7,D0
0000003C: 722B 'r+' MOVEQ #$2B,D1 ; '+'
0000003E: B280 '..' CMP.L D0,D1
00000040: 588F 'X.' ADDQ.L #$4,A7
00000042: 6610 'f.' BNE.S *+$0012 ; 00000054
00000044: 202B 0002 ' +..' MOVE.L $0002(A3),D0
00000048: E480 '..' ASR.L #$2,D0
0000004A: 2F00 '/.' MOVE.L D0,-(A7)
0000004C: 4EBA 0000 'N...' JSR Compile_Coder_AdditionalOffset ; id: 25
...
60924: Dictionary: Flags $00 FirstId 54
60924: 54: kindToAssignInverted
60951: Pad
60952: Module: Flags=$01=(Local Data) Module="kindToAssignInverted"(54) Size=23698
60958: Content: Flags $09
60958: Contents offset $0000 size $0026
$000000: 002A 002E 0029 002F 002F 006B 002A 002D '.*...)././.k.*.-'
$000010: 002B 002B 002B 002A 006B 002C 006B 006B '.+.+.+.*.k.,.k.k'
$000020: 006B 006B 002A '.k.k.*'
61004: Dictionary: Flags $00 FirstId 51
61004: 51: kindToAssignOpOffset
61031: Pad
61032: Module: Flags=$01=(Local Data) Module="kindToAssignOpOffset"(51) Size=24230
61038: Content: Flags $09
61038: Contents offset $0000 size $0013
$000000: 0002 FFFE FEFE 0001 FFFF FF03 FFFF FFFF '................'
$000010: FFFF 0100 '....'
...