GnuArm kompilerar fel för ARM9?
Postat: 9 april 2008, 16:25:15
Jag håller på med ett projekt där en ARM9 kör kod som kompileras med GnuArm (GCC) 4.1.1.
Den kompilerade koden blir inte som den borde.
Av någon anledning så lagras inte r0, r1, r2, r3 på stacken i början på funktioner. Detta gör att när en funktion anropas och den använder r0-r3 så kommer dessa register att ändras utanför funktionen vilket gör att processorn blir väldigt instabil och kraschar till och från.
Exempel:
En funktion borde bli så här:
void Function()
{
stmdb sp!, {r0,r1,r2,r3, lr}
mov r0, #256 ; 0x100
mov r1, #1 ; 0x1
...
Men istället blir den:
void Function()
{
mov r0, #256 ; 0x100
mov r1, #1 ; 0x1
...
Så r0, r1 kommer att få dessa värden där funktionen anropades.
Däremot så lagras alla register efter r3 dvs r4, r5 osv...
Så
void Function()
{
stmdb sp!, {r4,r5, lr}
mov r4, #256 ; 0x100
mov r5, #1 ; 0x1
...
Fungerar utmärkt.
Finns det någon inställning för kompilatorn för att få den att lagra undan r0-r3?
Är det en kompilatorbugg?
Kan det ha något med kodoptimering att göra?
Den kompilerade koden blir inte som den borde.
Av någon anledning så lagras inte r0, r1, r2, r3 på stacken i början på funktioner. Detta gör att när en funktion anropas och den använder r0-r3 så kommer dessa register att ändras utanför funktionen vilket gör att processorn blir väldigt instabil och kraschar till och från.
Exempel:
En funktion borde bli så här:
void Function()
{
stmdb sp!, {r0,r1,r2,r3, lr}
mov r0, #256 ; 0x100
mov r1, #1 ; 0x1
...
Men istället blir den:
void Function()
{
mov r0, #256 ; 0x100
mov r1, #1 ; 0x1
...
Så r0, r1 kommer att få dessa värden där funktionen anropades.
Däremot så lagras alla register efter r3 dvs r4, r5 osv...
Så
void Function()
{
stmdb sp!, {r4,r5, lr}
mov r4, #256 ; 0x100
mov r5, #1 ; 0x1
...
Fungerar utmärkt.
Finns det någon inställning för kompilatorn för att få den att lagra undan r0-r3?
Är det en kompilatorbugg?
Kan det ha något med kodoptimering att göra?