LLVM Codegenerierung verursacht Seg-Fehler?

8

Ich interessiere mich für die Erstellung von Sprachen und die Konstruktion von Compilern und habe das Beispiel hier durchgearbeitet: Ссылка . Der Autor verwendete LLVM 2.6, und nachdem ich ein paar Änderungen für LLVM 2.7 vorgenommen hatte, bekam ich den gesamten Codegenerierungscode zum kompilieren. Wenn der Compiler den Testcode eingibt,

%Vor%

das Programm funktioniert ordnungsgemäß, bis es versucht, den Code auszuführen, an welchem ​​Punkt es defaults. Ich bin dabei, LLDB auf meinem System zu bauen, aber es ist in der Zwischenzeit jemand einen offensichtlichen Seg Fehler in diesem LLVM Asm?

%Vor%

Die Ausgabe ist nur:

%Vor%

Mein Arch ist OS X x86_64.

Danke.

    
Paul Woolcock 09.08.2010, 12:50
quelle

2 Antworten

15

Ich habe dasselbe Problem. Ich habe Lorens Compiler gekürzt und alles funktionierte gut außer Ausführung.

Der Segmentierungsfehler wurde verursacht durch die Tatsache, dass:

  

ExecutionEngine * ee = EngineBuilder (Modul) .create ();

gibt NULL zurück. Um den tatsächlichen Fehler zu sehen, müssen Sie eine Fehlermeldung erhalten:

  

std :: Zeichenfolge Fehler;   ExecutionEngine * ee = EngineBuilder (Modul) .setErrorStr (& amp; error) .create ();

In Ihrem Fall sollten Sie wahrscheinlich sehen:

  

"Das Ziel für dieses Triple kann nicht gefunden werden (keine Ziele sind registriert)

Um das zu beheben, müssen Sie

anrufen
  

InitializeNativeTarget ();

Aber wenn du bekommst:

  

JIT wurde nicht verknüpft.

Sie sollten Folgendes einschließen:

  

llvm / ExecutionEngine / MCJIT.h

welches die JIT Engine verbindet.

    
user730816 29.04.2011, 10:10
quelle
0

Der von Ihnen gepostete LLVM ASM ist keine korrekte Übersetzung des von Ihnen vorgestellten C-Codes. Sie ordnen %a als Stapelvariable zu und laden dann nicht initialisierte Daten daraus und verwenden sie. Was Sie wollen tun, ist, Ihr Argument %a zu benennen und diesen Wert zu verwenden. Verwenden Sie stattdessen diesen Code:

%Vor%

Außerdem entspricht Ihr main() -Prototyp möglicherweise nicht dem, was Ihre C-Laufzeitbibliothek erwartet. Und darüber hinaus erkennen Sie, dass Sie das Ergebnis von do_math() nicht zurückgeben, oder?

    
Resistor 10.08.2010 09:36
quelle

Tags und Links