Ich spiele gerade mit einem einfachen, in Rust geschriebenen LLVM-Frontend herum. Ich versuche jetzt, Debug-Informationen auszugeben.
Wie kann ich diese Debug-Informationen (Quellorte und Variablen) über die C-Bindungen ausgeben? Ist es überhaupt möglich? Muss ich einen C++ Wrapper schreiben?
Es scheint eine Funktion zum Einfügen von Quellspeicherorten zu geben (LLVMSetCurrentDebugLocation; LLVM; Rost), aber ich weiß nicht, wie man eine richtige konstruiert LLVMValue
diese Informationen enthält. Ich denke, es braucht eine Art Metadaten.
Sehen DebugInfo.h für die Zuordnungen von den C++-LLVM-Debug-Info-APIs zu den C-Bindungen. Beispiele, die Sie benötigen, sind:
- neuer DIBuilder -> LLVMCreateDIBuilder()
- DIBuilder::createFile() -> LLVMDIBuilderCreateFile()
- DIBuilder::createCompileUnit() -> LLVMDIBuilderCreateCompileUnit()
- DIBuilder::createBasicType() -> LLVMDIBuilderCreateBasicType()
(verwenden Sie diese Funktionen, um den Zwergkontext für Ihren Compiler einzurichten)
Die von Ihnen erwähnte Funktion LLVMSetCurrentDebugLocation() ist das Äquivalent von IRBuilder<>::SetCurrentDebugLocation()
Für jeden Debug-Ausdruck benötigen Sie einen Debug-Speicherort und DWARF-Metadaten für den Ausdruck. Das geht wie folgt (C++-Fragment):
auto loc_glc = DebugLoc::get( line, column, dwFunc );
m_dwBuilder->insertDeclare( r, dwVar_gr, m_dwBuilder->createExpression(), loc_glc, fooBB );
m_builder.SetCurrentDebugLocation( loc_glc );
Sie möchten den Debug-Speicherort mit dem DWARF-Ausdruck verknüpfen und diesen dann mit LLVMSetCurrentDebugLocation() in Ihrem IRBuilder “verankern”.
Das würde ich bei manchen fragen
llvm
Mailingliste evtl llvm-dev– Basile Starynkevitch
6. Juli 2018 um 19:29 Uhr
Ich verwende vim als meine IDE mit einem Plugin namens YouCompleteMe. Dieses Plugin stellt Debug-Informationen mit LLVM bereit, ist aber nicht in Rust geschrieben. Vielleicht hilft ein Blick auf diesen Code? Der Autor des Plugins ist auch sehr reaktionsschnell und sein Code ist auf github.
– Jason Henochs
6. Juli 2018 um 20:15 Uhr
Sie können auch versuchen, sich die Debuginfo-Generierung des Rust-Compilers anzusehen. Ich bin mir nicht sicher, ob wir die C-Bindungen verwenden oder nicht: github.com/rust-lang/rust/blob/master/src/librustc_codegen_llvm/….
– Mark Rousskov
7. Juli 2018 um 14:55 Uhr
Bitte teilen Sie die Antwort, wenn Sie es schaffen, sie zu finden!
– Carson Harmon
25. September 2018 um 19:27 Uhr