================ @@ -2124,6 +2125,138 @@ layout and given the number of matches. ----------------------------- Total 71 8 +IR (Textual representation and bitcode) SUPPORT +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The below example is used to show the IR output generated by +:program:`llvm-debuginfo-analyzer`. We compiled the example for a +IR 64-bit target with Clang (-O0 -g --target=x86_64-linux): + +.. code-block:: c++ + + 1 using INTPTR = const int *; + 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) { + 3 if (ParamBool) { + 4 typedef int INTEGER; + 5 const INTEGER CONSTANT = 7; + 6 return CONSTANT; + 7 } + 8 return ParamUnsigned; + 9 } + +PRINT BASIC DETAILS +^^^^^^^^^^^^^^^^^^^ +The following command prints basic details for all the logical elements +sorted by the debug information internal offset; it includes its lexical +level and debug info format. + +.. code-block:: none + + llvm-debuginfo-analyzer --attribute=level,format + --output-sort=offset + --print=scopes,symbols,types,lines,instructions + test-clang.ll + +or + +.. code-block:: none + + llvm-debuginfo-analyzer --attribute=level,format + --output-sort=offset + --print=elements + test-clang.ll + +Each row represents an element that is present within the debug +information. The first column represents the scope level, followed by +the associated line number (if any), and finally the description of +the element. + +.. code-block:: none + + Logical View: + [000] {File} 'test-clang.ll' -> Textual IR + + [001] {CompileUnit} 'test.cpp' + [002] 2 {Function} extern not_inlined 'foo' -> 'int' + [003] {Block} + [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER' + [004] 5 {Line} + [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32' + [004] 6 {Line} + [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33' + [004] 6 {Line} + [004] {Code} 'br label %return, !dbg !33' + [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR' + [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int' + [003] 2 {Parameter} 'ParamBool' -> 'bool' + [003] 4 {TypeAlias} 'INTEGER' -> 'int' + [003] 2 {Line} + [003] {Code} '%retval = alloca i32, align 4' + [003] {Code} '%ParamPtr.addr = alloca ptr, align 8' + [003] {Code} '%ParamUnsigned.addr = alloca i32, align 4' + [003] {Code} '%ParamBool.addr = alloca i8, align 1' + [003] {Code} '%CONSTANT = alloca i32, align 4' + [003] {Code} 'store ptr %ParamPtr, ptr %ParamPtr.addr, align 8' + [003] {Code} 'store i32 %ParamUnsigned, ptr %ParamUnsigned.addr, align 4' + [003] {Code} '%storedv = zext i1 %ParamBool to i8' + [003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1' + [003] 8 {Line} + [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34' + [003] 8 {Line} + [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35' + [003] 8 {Line} + [003] {Code} 'br label %return, !dbg !35' + [003] 9 {Line} + [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36' + [003] 9 {Line} + [003] {Code} 'ret i32 %2, !dbg !36' + [003] 3 {Line} + [003] 3 {Line} + [003] 3 {Line} + [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26' + [002] 1 {TypeAlias} 'INTPTR' -> '* const int' + +SELECT LOGICAL ELEMENTS +^^^^^^^^^^^^^^^^^^^^^^^ +The following prints all *instructions*, *symbols* and *types* that +contain **'block'** or **'.store'** in their names or types, using a tab +layout and given the number of matches. + +.. code-block:: none ---------------- jmorse wrote:
I wonder if there's a more illustrative example to motivate the reader -- is it possible to search for "INTPTR" and discover both the type alias and the parameter? That's the sort of query I think I'd end up making: "I can see this type in the output format, but why is it present? -> Ah, it's a parameter to a function". (The current example is fine, I'm just trying to imagine a better one). https://github.com/llvm/llvm-project/pull/135440 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits