I get a data access exception running the following test driver on PowerPC 750
target board with VxWorks 5.4.2. The test driver is compiled with -O0 (no
optimization) and -mlongcall.
// This test driver reproduces the exception.
static int b=0;
static int a=0;
enum Enumeration1
{
MSG_NULL
, MSG1
, MSG2
, MSG3
, MSG4
, MSG5
, MSG_TOTAL
};
void doTest (void);
// This struct is similar to the RoseRT RTTypedValue_Enumeration1,
// except that type is int * instead of RTObject_class *.
struct RTTypedValue_Enumeration1
{
const void * data;
const int * type;
inline RTTypedValue_Enumeration1( const Enumeration1 & rtg_value, const
int * rtg_type )
: data( &rtg_value ), type( rtg_type = &b)
{
}
inline ~RTTypedValue_Enumeration1( void )
{
}
};
void doTest (void)
{
int j;
Enumeration1 enumValue = MSG_NULL;
for (int i = (MSG_NULL + 1); i < MSG_TOTAL; i++)
{
enumValue = (Enumeration1)i;
j=1234;
{
// This gets the exception in VxWorks (2nd iteration of loop).
RTTypedValue_Enumeration1 enumMsg( enumValue, &a);
}
j=5678;
}
}
int main(void)
{
doTest();
}
Something about calling the constructor inside a loop causes the exception.
The exception does not occur if the code is not compiled with -mlongcall or if
the code is compiled with optimization -O1 or higher. I am running the Wind
River Tornado version 2.0.2 fork of the gnu compiler. This test driver is a
simplified version of a bug we get with Rational Rose RealTime model built with
Tornado gnu compiler, sending a signal in a loop.
Can you tell me if this is a bug that has been fixed in gcc versions more
recent than the Wind River Tornado fork?
Below is the test1.s PowerPC assembly language generated by compiling with -
save-temps. The bug is that register r29 is OK the first iteration of the
loop, but r29 is modified and causes an exception on the second iteration of
the loop.
# GNU C++ cygnus-2.7.2-960126 egcs-971225 tornado 2.0 spr29516
# -fvolatile -fpeephole -ffunction-cse -fkeep-static-consts
# -fpcc-struct-return -fexceptions -fsjlj-exceptions -fcommon -fgnu-linker
# -mpowerpc -mnew-mnemonics -mlongcall -mstrict-align
.file "test1.cpp"
.stabs "/Tmp/Tornado/PPC604gnu/",100,0,0,.Ltext0
.stabs "C:/Tmp/Tornado/test1.cpp",100,0,0,.Ltext0
.section ".text"
.Ltext0:
.stabs "gcc2_compiled.", 0x3c, 0, 0, 0
.stabs "int:t(0,1)=r(0,1);-2147483648;2147483647;",128,0,0,0
.stabs "char:t(0,2)=r(0,2);0;255;",128,0,0,0
.stabs "long int:t(0,3)=r(0,3);-2147483648;2147483647;",128,0,0,0
.stabs "unsigned int:t(0,4)=r(0,4);0;-1;",128,0,0,0
.stabs "long unsigned int:t(0,5)=r(0,5);0;-1;",128,0,0,0
.stabs "long long int:t(0,6)=r
(0,1);01000000000000000000000;0777777777777777777777;",128,0,0,0
.stabs "long long unsigned int:t(0,7)=r
(0,1);0000000000000;01777777777777777777777;",128,0,0,0
.stabs "short int:t(0,8)=r(0,8);-32768;32767;",128,0,0,0
.stabs "short unsigned int:t(0,9)=r(0,9);0;65535;",128,0,0,0
.stabs "signed char:t(0,10)=r(0,10);-128;127;",128,0,0,0
.stabs "unsigned char:t(0,11)=r(0,11);0;255;",128,0,0,0
.stabs "float:t(0,12)=r(0,1);4;0;",128,0,0,0
.stabs "double:t(0,13)=r(0,1);8;0;",128,0,0,0
.stabs "long double:t(0,14)=r(0,1);8;0;",128,0,0,0
.stabs "complex int:t(0,15)=s8real:(0,1),0,32;imag:(0,1),32,32;;",128,0,0,0
.stabs "complex float:t(0,16)=r(0,16);4;0;",128,0,0,0
.stabs "complex double:t(0,17)=r(0,17);8;0;",128,0,0,0
.stabs "complex long double:t(0,18)=r(0,18);8;0;",128,0,0,0
.stabs "bool:t(0,19)[EMAIL PROTECTED];-16;",128,0,0,0
.stabs "void:t(0,20)=(0,20)",128,0,0,0
.stabs "__wchar_t:t(0,21)=r(0,21);0;65535;",128,0,0,0
.stabs "__vtbl_ptr_type:T(0,22)=s8__delta:(0,8),0,16;__index:
(0,8),16,16;\\",128,0,0,0
.stabs "__pfn:(0,23)=*(0,20),32,32;__delta2:(0,8),32,16;;",128,0,0,0
.stabs "__vtbl_ptr_type:t(0,22)",128,0,0,0
.section ".data"
.stabs "b:S(0,1)",38,0,3,b
.align 2
.type b,@object
.size b,4
b:
.long 0
.stabs "a:S(0,1)",38,0,4,a
.align 2
.type a,@object
.size a,4
a:
.long 0
.stabs "Enumeration1:t(0,24)=eMSG_NULL:0,MSG1:1,MSG2:2,\\",128,0,0,0
.stabs "MSG3:3,MSG4:4,MSG5:5,MSG_TOTAL:6,;",128,0,9,0
.stabs "RTTypedValue_Enumeration1:T(0,25)=s8data:(0,26)=*
(0,20),0,32;\\",128,0,0,0
.stabs "type:(0,27)=*(0,1),32,32;__as::(0,28)=##(0,29)=&
(0,25);:RC25RTTypedValue_Enumeration1;2A.;\\",128,0,0,0
.stabs "RTTypedValue_Enumeration1::(0,30)=##(0,31)=*
(0,25);:RC25RTTypedValue_Enumeration1;2A.\\",128,0,0,0
.stabs "(0,32)=##(0,31);:RC12Enumeration1PCi;2A.(0,33)=#(0,25),(0,20),(0,31),
(0,1),(0,20);:_$_25RTTypedValue_Enumeration1;2A.;;",128,0,0,0
.stabs "RTTypedValue_Enumeration1:Tt(0,25)",128,0,32,0
.section ".text"
.align 2
.stabs "doTest__Fv:F(0,20)",36,0,37,doTest__Fv
.globl doTest__Fv
.type doTest__Fv,@function
doTest__Fv:
.stabn 68,0,37,.LM1-doTest__Fv
.LM1:
stwu 1,-64(1)
mflr 0
stw 28,48(1)
stw 29,52(1)
stw 30,56(1)
stw 31,60(1)
stw 0,68(1)
mr 31,1
.stabn 68,0,37,.LM2-doTest__Fv
.LM2:
addis 9,0,[EMAIL PROTECTED]
addi 29,9,[EMAIL PROTECTED]
mtlr 29
blrl
mr 0,3
mr 9,0
mr 0,9
mr 29,0
.stabn 68,0,37,.LM3-doTest__Fv
.LM3:
.LBB2:
.stabn 68,0,39,.LM4-doTest__Fv
.LM4:
li 0,0
stw 0,12(31)
.stabn 68,0,41,.LM5-doTest__Fv
.LM5:
li 0,1
stw 0,16(31)
.L8:
.LBB3:
lwz 0,16(31)
cmpwi 1,0,5
bc 4,5,.L11
b .L9
.L11:
.stabn 68,0,43,.LM6-doTest__Fv
.LM6:
lwz 0,16(31)
stw 0,12(31)
.stabn 68,0,44,.LM7-doTest__Fv
.LM7:
li 0,1234
stw 0,8(31)
.stabn 68,0,45,.LM8-doTest__Fv
.LM8:
.LBB4:
.stabn 68,0,47,.LM9-doTest__Fv
.LM9:
addi 0,31,24
addi 9,31,12
mr 3,0
mr 4,9
addis 9,0,[EMAIL PROTECTED]
addi 5,9,[EMAIL PROTECTED]
addis 9,0,[EMAIL PROTECTED]
addi 28,9,[EMAIL PROTECTED]
mtlr 28
blrl
mr 9,29
lwz 0,0(9)
addic 9,0,4
lwz 0,0(9)
stw 0,32(31)
addis 11,0,[EMAIL PROTECTED]
addi 0,11,[EMAIL PROTECTED]
stw 0,36(31)
addi 0,31,24
stw 0,40(31)
addi 0,31,32
stw 0,0(9)
mr 9,29
lwz 0,0(9)
addic 9,0,4
lwz 11,0(9)
lwz 0,0(11)
stw 0,0(9)
addi 0,31,24
mr 3,0
li 4,2
addis 9,0,[EMAIL PROTECTED]
addi 29,9,[EMAIL PROTECTED]
mtlr 29
blrl
.LBE4:
.stabn 68,0,49,.LM10-doTest__Fv
.LM10:
li 0,5678
stw 0,8(31)
.LBE3:
.stabn 68,0,50,.LM11-doTest__Fv
.LM11:
.L10:
lwz 9,16(31)
addi 0,9,1
mr 9,0
stw 9,16(31)
b .L8
.L9:
.LBE2:
.L7:
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 28,-16(11)
lwz 29,-12(11)
lwz 30,-8(11)
lwz 31,-4(11)
mr 1,11
blr
.Lfe1:
.size doTest__Fv,.Lfe1-doTest__Fv
.stabs "j:(0,1)",128,0,38,8
.stabs "enumValue:(0,24)",128,0,39,12
.stabs "i:(0,1)",128,0,41,16
.stabn 192,0,0,.LBB2-doTest__Fv
.stabn 192,0,0,.LBB3-doTest__Fv
.stabs "enumMsg:(0,25)",128,0,47,24
.stabn 192,0,0,.LBB4-doTest__Fv
.stabn 224,0,0,.LBE4-doTest__Fv
.stabn 224,0,0,.LBE3-doTest__Fv
.stabn 224,0,0,.LBE2-doTest__Fv
.align 2
.stabs "main:F(0,1)",36,0,55,main
.globl main
.type main,@function
main:
.stabn 68,0,55,.LM12-main
.LM12:
stwu 1,-16(1)
mflr 0
stw 31,12(1)
stw 0,20(1)
mr 31,1
.stabn 68,0,55,.LM13-main
.LM13:
.stabn 68,0,55,.LM14-main
.LM14:
.LBB5:
.stabn 68,0,56,.LM15-main
.LM15:
bl doTest__Fv
.LBE5:
li 3,0
b .L12
.L12:
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 31,-4(11)
mr 1,11
blr
.Lfe2:
.size main,.Lfe2-main
.stabn 192,0,0,.LBB5-main
.stabn 224,0,0,.LBE5-main
.align 2
.stabs "_$_25RTTypedValue_Enumeration1:F
(0,20)",36,0,30,_$_25RTTypedValue_Enumeration1
.stabs "this:P(0,31)",64,0,30,29
.stabs "__in_chrg:P(0,1)",64,0,30,28
.weak _$_25RTTypedValue_Enumeration1
.type _$_25RTTypedValue_Enumeration1,@function
_$_25RTTypedValue_Enumeration1:
.stabn 68,0,30,.LM16-_$_25RTTypedValue_Enumeration1
.LM16:
stwu 1,-32(1)
mflr 0
stw 27,12(1)
stw 28,16(1)
stw 29,20(1)
stw 30,24(1)
stw 31,28(1)
stw 0,36(1)
mr 31,1
mr 29,3
mr 28,4
.stabn 68,0,30,.LM17-_$_25RTTypedValue_Enumeration1
.LM17:
.stabn 68,0,30,.LM18-_$_25RTTypedValue_Enumeration1
.LM18:
.LBB6:
.LBE6:
.L4:
rlwinm 0,28,0,31,31
cmpwi 1,0,0
bc 12,6,.L6
mr 3,29
addis 9,0,[EMAIL PROTECTED]
addi 27,9,[EMAIL PROTECTED]
mtlr 27
blrl
b .L6
.L5:
.L6:
.L3:
lwz 11,0(1)
lwz 0,4(11)
mtlr 0
lwz 27,-20(11)
lwz 28,-16(11)
lwz 29,-12(11)
lwz 30,-8(11)
lwz 31,-4(11)
mr 1,11
blr
.Lfe3:
.size _$_25RTTypedValue_Enumeration1,.Lfe3-
_$_25RTTypedValue_Enumeration1
.stabn 192,0,0,.LBB6-_$_25RTTypedValue_Enumeration1
.stabn 224,0,0,.LBE6-_$_25RTTypedValue_Enumeration1
.align 2
.stabs "__25RTTypedValue_Enumeration1RC12Enumeration1PCi:F
(0,31)",36,0,26,__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.stabs "this:P(0,31)",64,0,26,11
.stabs "rtg_value:P(0,34)=&(0,24)",64,0,26,0
.stabs "rtg_type:P(0,27)",64,0,26,9
.weak __25RTTypedValue_Enumeration1RC12Enumeration1PCi
.type __25RTTypedValue_Enumeration1RC12Enumeration1PCi,@function
__25RTTypedValue_Enumeration1RC12Enumeration1PCi:
.stabn 68,0,26,.LM19-__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.LM19:
stwu 1,-16(1)
stw 31,12(1)
mr 31,1
mr 11,3
mr 0,4
mr 9,5
.stabn 68,0,26,.LM20-__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.LM20:
.stabn 68,0,26,.LM21-__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.LM21:
stw 0,0(11)
addis 10,0,[EMAIL PROTECTED]
addi 9,10,[EMAIL PROTECTED]
addis 8,0,[EMAIL PROTECTED]
addi 10,8,[EMAIL PROTECTED]
stw 10,4(11)
.stabn 68,0,27,.LM22-__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.LM22:
.LBB7:
.LBE7:
.L2:
mr 3,11
b .L1
.L1:
lwz 11,0(1)
lwz 31,-4(11)
mr 1,11
blr
.Lfe4:
.size __25RTTypedValue_Enumeration1RC12Enumeration1PCi,.Lfe4-
__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.stabn 192,0,0,.LBB7-__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.stabn 224,0,0,.LBE7-__25RTTypedValue_Enumeration1RC12Enumeration1PCi
.stabs "",100,0,0,.Letext
.Letext:
.ident "GCC: (GNU) cygnus-2.7.2-960126 egcs-971225 tornado 2.0
spr29516"
Below is a copy of some VxWorks sessions showing the exception, and showing
single stepping with the debugger.
2/12/05
Tornado C++ Test driver gets exception in VxWorks.
The program gets this data access exception:
data access
Exception current instruction address: 0x01ffc234
Machine Status Register: 0x0000b030
Data Access Register: 0x9421ffe4
Condition Register: 0x28000000
Data storage interrupt Register: 0x40000000
Task: 0x1e95180 "t1"
due to access to invalid memory address 0x9421ffe4.
The PowerPC machine code below gets the exception:
0x1ffc228 7fa9eb78 or r9,r29,r29
0x1ffc22c 80090000 lwz r0,0(r9)
0x1ffc230 31200004 addic r9,r0,4
0x1ffc234 80090000 lwz r0,0(r9) ******* This line gets exception!!
Breakpoint and single step in the debugger shows OK value
r29 = 1fff320
on the first pass through the loop,
but different value the second pass.
r29 = 1ffc304
The invalid value 0x1ffc304
is _$_25RTTypedValue_Enumeration1
which is RTTypedValue_Enumeration1 constructor or destructor I guess.
r29 is set to that invalid value here:
0x1ffc280 3ba9c304 addi r29,r9,-15612
0x1ffc284 7fa803a6 mtspr LR,r29
0x1ffc288 4e800021 blrl
I guess that is OK,
except that r29 is used in the second pass of the loop
like it expected it to be unchanged.
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
]]]]]]]]]]]]]]]]]]]]]]]]]]] VxWorks version 5.4.2
]]]]]]]]]]]]]]]]]]]]]]]]]] KERNEL: WIND version 2.5
]]]]]]]]]]]]]]]]]]]]]]]]] Copyright Wind River Systems, Inc., 1984-2000
CPU: Vista Controls-ScorePPC FCCP. Processor #0.
Memory Size: 0x2000000. BSP version 1.2/0.
WDB: Ready.
-> cd "/asep/asep/mpu/steve"
value = 0 = 0x0
-> ld < TestProject.out
value = 33540392 = 0x1ffc928 = _dtors + 0x538
-> sp main
task spawned: id = 0x1e95180, name = t1
value = 32067968 = 0x1e95180
->
data access
Exception current instruction address: 0x01ffc234
Machine Status Register: 0x0000b030
Data Access Register: 0x9421ffe4
Condition Register: 0x28000000
Data storage interrupt Register: 0x40000000
Task: 0x1e95180 "t1"
-> tt t1
1bb2f8 vxTaskEntry +60 : main ()
1ffc2e4 main +18 : doTest__Fv ()
value = 0 = 0x0
-> ti t1
NAME ENTRY TID PRI STATUS PC SP ERRNO DELAY
---------- ------------ -------- --- ---------- -------- -------- ------- -----
t1 main 1e95180 100 SUSPEND 1ffc234 1e950d8 0 0
stack: base 0x1e95180 end 0x1e90360 size 19728 high 792 margin 18936
options: 0x1d
VX_SUPERVISOR_MODE VX_DEALLOC_STACK VX_FP_TASK VX_STDIO
r0 = 9421ffe0 sp = 1e950d8 r2 = 0 r3 = 1e950f0
r4 = 1e950e4 r5 = 1ffc3d4 r6 = 4 r7 = fffffff8
r8 = 2000000 r9 = 9421ffe4 r10 = 1ffc3d0 r11 = 1e950d8
r12 = 0 r13 = 0 r14 = 0 r15 = 0
r16 = 0 r17 = 0 r18 = 0 r19 = 0
r20 = 0 r21 = 0 r22 = 0 r23 = 0
r24 = 0 r25 = 0 r26 = 0 r27 = 0
r28 = 1ffc37c r29 = 1ffc304 r30 = 0 r31 = 1e950d8
msr = b030 lr = 1ffc228 ctr = 0 pc = 1ffc234
cr = 28000000 xer = 0
fpcsr = 0
fr0 = NaN fr1 = NaN fr2 = NaN fr3 = NaN
fr4 = NaN fr5 = NaN fr6 = NaN fr7 = NaN
fr8 = NaN fr9 = NaN fr10 = NaN fr11 = NaN
fr12 = NaN fr13 = NaN fr14 = NaN fr15 = NaN
fr16 = NaN fr17 = NaN fr18 = NaN fr19 = NaN
fr20 = NaN fr21 = NaN fr22 = NaN fr23 = NaN
fr24 = NaN fr25 = NaN fr26 = NaN fr27 = NaN
fr28 = NaN fr29 = NaN fr30 = NaN fr31 = NaN
data access
Exception current instruction address: 0xva0lue = 1ffc234
Machine Status Register: 0x00000b030
Data Access Register: 0x = 09421ffe4x
Condition Register: 0x028000000
Data storage interrupt Register: 0x->40000000
-> l 0x1ffc234
0x1ffc234 80090000 lwz r0,0(r9)
0x1ffc238 901f0020 stw r0,32(r31)
0x1ffc23c 3d600200 lis r11,512
0x1ffc240 380bc304 addi r0,r11,-15612
0x1ffc244 901f0024 stw r0,36(r31)
0x1ffc248 381f0018 addi r0,r31,24
0x1ffc24c 901f0028 stw r0,40(r31)
0x1ffc250 381f0020 addi r0,r31,32
0x1ffc254 90090000 stw r0,0(r9)
0x1ffc258 7fa9eb78 or r9,r29,r29
value = 33538652 = 0x1ffc25c = doTest__Fv + 0xcc
Thanks for any help you can provide,
Steve Sciance
General Dynamics, Land Systems
[EMAIL PROTECTED]
(586)825-5068
--
Summary: Exception with Tornado C++ on PowerPC target
Product: gcc
Version: unknown
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: sciance at gdls dot com
CC: gcc-bugs at gcc dot gnu dot org
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=19957