Wie kann ich Debug-Informationen über LLVMs-C-Bindungen ausgeben?

Lesezeit: 2 Minuten

Benutzer-Avatar
dotjpg3141

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.

  • 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

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”.

1096000cookie-checkWie kann ich Debug-Informationen über LLVMs-C-Bindungen ausgeben?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy