Compilerfehler beim Inline-ASM seit Qt-UI



  • Guten Abend!

    Seit ich für mein CPU-Erkennungsprogramm mit dem Qt-Designer eine Qt-Oberfläche * erstellt habe bekomme ich den folgenden Fehler:

    linux:/mnt/D/Programmierung/cpp/@aci/qt-ui # qmake && make
    /usr/lib/qt3/bin/uic dialog.ui -o .ui/dialog.h
    g++ -c -pipe -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -fPIC -Wall -W -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -fPIC  -DQT_NO_DEBUG -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I/usr/include -I/usr/lib/qt3/include -I.ui/ -I. -I.moc/ -o .obj/main.o main.cpp
    g++ -c -pipe -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -fPIC -Wall -W -O2 -march=i586 -mcpu=i686 -fmessage-length=0 -fPIC  -DQT_NO_DEBUG -DQT_SHARED -DQT_TABLET_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I/usr/include -I/usr/lib/qt3/include -I.ui/ -I. -I.moc/ -o .obj/cpu1.o ../cpu1.cpp
    ../cpu1.cpp: In member function `int CPU::IdentVendor()':
    [b]../cpu1.cpp:13: error: can't find a register in class `BREG' while reloading `asm'[/b]
    make: *** [.obj/cpu1.o] Error 1
    linux:/mnt/D/Programmierung/cpp/@aci/qt-ui #
    

    in Zeile 13 in cpu1.cpp verwende ich ein Makro:

    CPUID(ea, eb, ec, ed, 0);
    

    Das Makro ist so definiert:

    #if defined(__GNUC__)
      #define CPUID(p1,p2,p3,p4,p5) \
        asm("cpuid" : "=a"(p1), "=b"(p2), "=c"(p3), "=d"(p4) : "a"(p5));
      #define RDTSC(v1,v2) asm("rdtsc" : "=a"(v1), "=d"(v2));
    #elif def... usw. ... etc. ...
    

    Vorher funktionierte alles prima.
    Irgendwelche Ideen woran das liegt und wie ich den Fehler beheben kann?

    MfG
    mastercpp

    PS: full source here.
    PPS: * (still experimental pre-alpha)



  • Nachdem du das Makefile mit qmake erzeugt hast, must du im Makefile aus den CFLAGS und CXXFLAGS das -fPIC entfernen.
    Und wenn du willst, das CPU::Speed() auch funktioniert musst du -O2 ebenfalls entfernen.



  • Danke, das hat funktioniert.
    Aber kann ich das auch irgendwie in die PROjekt-Datei schreiben, dass die beiden Compiler-flags nicht benutzt weren sollen?



  • wxer schrieb:

    Nachdem du das Makefile mit qmake erzeugt hast, must du im Makefile aus den CFLAGS und CXXFLAGS das -fPIC entfernen.

    Nee... Das würd ich nicht machen.
    Es ist besser seinen Code so umzugestallten, dass ebx nicht verwendent wird, denn es kann immer sein, das jemand den Code in seinem eigenen Projekt verwendet und dann unwissend mit -fPIC kompiliert.
    So z.B:

    asm volatile("push %%ebx; cpuid; mov %%ebx, %%edi; pop %%ebx" : "=a"(ea), "=D"(eb), "=c"(ec), "=d"(ed) : "a"(in));
    


  • wxer schrieb:

    Und wenn du willst, das CPU::Speed() auch funktioniert musst du -O2 ebenfalls entfernen.

    Besser ist es, wenn man

    #define RDTSC(v1,v2) asm("rdtsc" : "=a"(v1), "=d"(v2));
    

    in

    #define RDTSC(v1,v2) asm volatile("rdtsc" : "=a"(v1), "=d"(v2));
    

    ändert.
    Dann kan man auch mit -O2 compilieren ohne dass irgendwas wegoptimiert wird.



  • Funktioniert prima. Vielen Dank Leute!


Anmelden zum Antworten