liquid
2004-05-19, 21:36:57
Hiho,
ich habe ein kleines Problem mit dem MinGW (basierend auf dem neusten GCC 3.4) - und zwar wenn die höchste Optimierungsstufe aktiviert ist.
Und zwar...
habe ich mehrere memcpy Funktionen, die Daten in den ulkigsten Art und Weisen durch die Gegend schaufeln. Diese Funktionen bestehen alle im Kern aus Inline-Assembler.
Jetzt habe ich eine weitere Funktion, die zur Performancemessung da ist. In dieser soll getestet werden wie schnell die einzelnen memcpys sind. Es ist manchmal schon erstaunlich wie dumm sich die Compiler bei einer simplen For-Schleife anstellen, aber naja...
Der Inline-Assembler Code ist als volatile deklariert, dem Compiler wird also ausdrücklich untersagt den Asm zu verändern, umzustrukturieren und sonstige Späßchen damit zu veranstalten.
Jetzt macht der GCC in der höchsten Optimierungsstufe aber große Scheisse, die zu einer Segfault führt. Ich erkläre kurz wie weit ich mit dem Debuggen schon bin. Ich habe die gesamte Performancemessungsfunktion durch auskommentieren aller irrelevanter Zeilen nur auf Allokation, Kopieren und Deallokation beschränkt.
Sämtliche Ausgabe fallen unter den Tisch, ich dachte mir vielleicht liegt es ja daran. Aber er segfaultet immer noch.
Nun habe ich mir den Asm-Code angeguckt und er hält sich auch schon an das volatile. Was er allerdings macht ist folgendes:
Ich übergebe den memcpy Funktionen ja immer drei Parameter: src, dst und size. Diese sollen in GPRs geladen werden, was auch funktioniert. Allerdings nimmt der GCC fälschlicherweise an, dass sich die GPRs nicht ändern, er also die dort gespeicherten Werte für den nächsten Aufruf weiterverwenden kann.
So lädt er die Werte vom Stack gerade mal einmal in die GPRs rein und benutzt sie dann in allen Funktionen. Das geht natürlich nicht, da ich die Variablen in den GPRs ja verändere. Das scheint er allerdings nicht begreifen zu wollen. Jetzt habe ich es schon mit den + und = Modifiern probiert, aber die mag er bei Input-Registern ja nicht.
Ich weiß nicht was ich machen soll, irgendwie muss man dem Compiler doch verklickern können, dass er die Werte leider mehrmals aus dem Stack fischen muss, da sich die Werte in den Registern ändern. Aber wie?? Oder geht das überhaupt nicht und das ganze ist vielleicht ein Bug im GCC??
Vielen Dank schonmal!!
cya
liquid
ich habe ein kleines Problem mit dem MinGW (basierend auf dem neusten GCC 3.4) - und zwar wenn die höchste Optimierungsstufe aktiviert ist.
Und zwar...
habe ich mehrere memcpy Funktionen, die Daten in den ulkigsten Art und Weisen durch die Gegend schaufeln. Diese Funktionen bestehen alle im Kern aus Inline-Assembler.
Jetzt habe ich eine weitere Funktion, die zur Performancemessung da ist. In dieser soll getestet werden wie schnell die einzelnen memcpys sind. Es ist manchmal schon erstaunlich wie dumm sich die Compiler bei einer simplen For-Schleife anstellen, aber naja...
Der Inline-Assembler Code ist als volatile deklariert, dem Compiler wird also ausdrücklich untersagt den Asm zu verändern, umzustrukturieren und sonstige Späßchen damit zu veranstalten.
Jetzt macht der GCC in der höchsten Optimierungsstufe aber große Scheisse, die zu einer Segfault führt. Ich erkläre kurz wie weit ich mit dem Debuggen schon bin. Ich habe die gesamte Performancemessungsfunktion durch auskommentieren aller irrelevanter Zeilen nur auf Allokation, Kopieren und Deallokation beschränkt.
Sämtliche Ausgabe fallen unter den Tisch, ich dachte mir vielleicht liegt es ja daran. Aber er segfaultet immer noch.
Nun habe ich mir den Asm-Code angeguckt und er hält sich auch schon an das volatile. Was er allerdings macht ist folgendes:
Ich übergebe den memcpy Funktionen ja immer drei Parameter: src, dst und size. Diese sollen in GPRs geladen werden, was auch funktioniert. Allerdings nimmt der GCC fälschlicherweise an, dass sich die GPRs nicht ändern, er also die dort gespeicherten Werte für den nächsten Aufruf weiterverwenden kann.
So lädt er die Werte vom Stack gerade mal einmal in die GPRs rein und benutzt sie dann in allen Funktionen. Das geht natürlich nicht, da ich die Variablen in den GPRs ja verändere. Das scheint er allerdings nicht begreifen zu wollen. Jetzt habe ich es schon mit den + und = Modifiern probiert, aber die mag er bei Input-Registern ja nicht.
Ich weiß nicht was ich machen soll, irgendwie muss man dem Compiler doch verklickern können, dass er die Werte leider mehrmals aus dem Stack fischen muss, da sich die Werte in den Registern ändern. Aber wie?? Oder geht das überhaupt nicht und das ganze ist vielleicht ein Bug im GCC??
Vielen Dank schonmal!!
cya
liquid