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.
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
anrufenInitializeNativeTarget ();
Aber wenn du bekommst:
JIT wurde nicht verknüpft.
Sie sollten Folgendes einschließen:
llvm / ExecutionEngine / MCJIT.h
welches die JIT Engine verbindet.
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:
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?
Tags und Links llvm