2013-07-28 9 views
12

Chcę znaleźć kilka opcji debugowania dla brzękiem/LLVM, które działają jak GCC -fdump-tree-all-all-fdump-rtl-all-all-fdump-ipa-all-all.Dump IR po każdej optymalizacji LLVM (każdy towarzysza), obie przełęcze LLVM IR i backend debugowania

Zasadniczo chcę mieć zrzuty LLVM IR przed i po każdym przejściu optymalizacji, również może być użyteczne posiadanie wszystkich zrzutów AST z klang i wszystkich faz generowania kodu (fazy backend, Selection DAG, ISEL-SDNode, przydział rejestrów, MCInsts).

Udało mi się znaleźć tylko klangową -ccc-print-phases, ale wydrukują tylko nazwy faz wysokiego poziomu, np. preprocess-compile-asemble-link; ale nie ma żadnego zrzutu IR.

Ponadto istnieje Life of an instruction in LLVM papier z -cc1-ast-dump opcja zrzucić ASTs dzyń, ale chcę więcej, zwłaszcza dla Codegen.

+3

Hmm, tam "-print-after-all" - drukuj IR po każdym przejściu; -print-before-all - 'Drukuj IR przed każdym przejściem'' dla faz IR, b jak zdobyć zrzuty z zaplecza? – osgx

+0

Możesz wydrukować informacje debugowania z fazy backendu, np. Obiekt 'CGDebugInfo' od kodegena. – shrm

+0

mishr, nie jest CGDebugInfo z clang IR emiter, nie z backendu llvm? Chcę uzyskać informacje z LLVM backend kodu IR-to-maszyny (codegen) – osgx

Odpowiedz

13

Wygląda na to, że już wiesz, jak robić zrzuty na poziomie AST Clang i na poziomie LLVM IR. W przypadku kodegenu użyteczne są następujące elementy:

-debug dla szczegółowych tekstowych zrzutów wyboru instrukcji i późniejszych etapów. Również -view*-dags show (pop-up) DAG:

$ llc -help-hidden|grep dags 
    -view-dag-combine-lt-dags      - Pop up a window to show dags before the post legalize types dag combine pass 
    -view-dag-combine1-dags      - Pop up a window to show dags before the first dag combine pass 
    -view-dag-combine2-dags      - Pop up a window to show dags before the second dag combine pass 
    -view-isel-dags        - Pop up a window to show isel dags as they are selected 
    -view-legalize-dags       - Pop up a window to show dags before legalize 
    -view-legalize-types-dags      - Pop up a window to show dags before legalize types 
    -view-misched-dags        - Pop up a window to show MISched dags after they are processed 
    -view-sched-dags        - Pop up a window to show sched dags as they are processed 
    -view-sunit-dags        - Pop up a window to show SUnit dags after they are processed 

Te mogą nie pokazać się, jeśli nie skonfigurowano & skompilowany LLVM z obsługą graphviz.

+0

Eli, czy możesz dodać informacje o klang i zrzutach IR do swojej odpowiedzi? – osgx

+0

I -print-machineinstrs mogą być przydatne. Mój program llvm 3.2 nie ma żadnego z "-view - * - dags". – osgx

+0

@osgx: zobacz moją edycję w.r.t. brak "-view- *". Jeśli chodzi o inne zrzuty, zapraszam do edycji mojej odpowiedzi z informacjami już wklejonymi na pytania i komentarze :) –

-3

Używam llvm-gcc-4.2 w utworach Mountain Lion i -fdump-tree-all.

gcc -fdump-tree-all -o test file1.c file2.c file1.h -I . 
+0

Czy wyprowadza rdzeń IR LLVM, czy tylko wewnętrzną reprezentację GCC? – osgx

2

Nie w pełni o Twoje pytanie, ale aby zobaczyć zastosowano przełęcze, można zrobić:

clang test.c -Ofast -march=core-avx2 -mllvm -debug-pass=Arguments

będzie zobaczyć coś takiego:

Pass Arguments: -datalayout -notti -basictti -x86tti -targetlibinfo -jump-instr-table-info -targetpassconfig -no-aa -tbaa -scoped-noalias -basicaa -collector-metadata -machinemoduleinfo -machine-branch-prob -jump-instr-tables -verify -verify-di -domtree -loops -loop-simplify -scalar-evolution -iv-users -loop-reduce -gc-lowering -unreachableblockelim -consthoist -partially-inline-libcalls -codegenprepare -verify-di -stack-protector -verify -domtree -loops -branch-prob -machinedomtree -expand-isel-pseudos -tailduplication -opt-phis -machinedomtree -slotindexes -stack-coloring -localstackalloc -dead-mi-elimination -machinedomtree -machine-loops -machine-trace-metrics -early-ifcvt -machinelicm -machine-cse -machine-sink -peephole-opts -dead-mi-elimination -processimpdefs -unreachable-mbb-elimination -livevars -machinedomtree -machine-loops -phi-node-elimination -twoaddressinstruction -slotindexes -liveintervals -simple-register-coalescing -misched -machine-block-freq -livedebugvars -livestacks -virtregmap -liveregmatrix -edge-bundles -spill-code-placement -virtregrewriter -stack-slot-coloring -machinelicm -edge-bundles -prologepilog -machine-block-freq -branch-folder -tailduplication -machine-cp -postrapseudos -machinedomtree -machine-loops -post-RA-sched -gc-analysis -machine-block-freq -block-placement2 -stackmap-liveness -machinedomtree -machine-loops

+0

Zinovy, dziękuję, może być pomocne. Jaka jest minimalna wersja clang/llvm, aby użyć "-debug-pass = Arguments"? – osgx

+2

'-mllvm -debug-pass = Struktura' jest jeszcze ładniejsza. Zawiera dane wyjściowe '-debug-pass = Arguments', ale także zrzuca drzewo optymalizacji zastosowane z nazwami czytelnymi dla człowieka. – gluk47