Skip to content

Revert "[llvm-debuginfo-analyzer] Add support for LLVM IR format. (#135440)" - #199890

Merged
CarlosAlbertoEnciso merged 1 commit into
llvm:mainfrom
CarlosAlbertoEnciso:revert-debuginfo-analyzer-ir-reader
May 27, 2026
Merged

Revert "[llvm-debuginfo-analyzer] Add support for LLVM IR format. (#135440)"#199890
CarlosAlbertoEnciso merged 1 commit into
llvm:mainfrom
CarlosAlbertoEnciso:revert-debuginfo-analyzer-ir-reader

Conversation

@CarlosAlbertoEnciso

Copy link
Copy Markdown
Member

This reverts commit 6bbbf74.

There are link issues with some buildbots.

…vm#135440)"

This reverts commit 6bbbf74.

There are link issues with some builbots.
@llvmorg-github-actions

Copy link
Copy Markdown

@llvm/pr-subscribers-debuginfo

Author: Carlos Alberto Enciso (CarlosAlbertoEnciso)

Changes

This reverts commit 6bbbf74.

There are link issues with some buildbots.


Patch is 239.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/199890.diff

41 Files Affected:

  • (modified) llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst (+126-79)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h (-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h (-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h (-3)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h (+1-14)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h (+2-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h (-1)
  • (removed) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h (-302)
  • (modified) llvm/lib/DebugInfo/LogicalView/CMakeLists.txt (-2)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVElement.cpp (+4-13)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVLocation.cpp (-5)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp (+1-29)
  • (modified) llvm/lib/DebugInfo/LogicalView/LVReaderHandler.cpp (+8-32)
  • (removed) llvm/lib/DebugInfo/LogicalView/Readers/LVIRReader.cpp (-2630)
  • (modified) llvm/lib/Transforms/Utils/DebugSSAUpdater.cpp (+2-9)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-compare-logical-elements.test (-121)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test (-78)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test (-151)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test (-60)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/03-ir-incorrect-lexical-scope-typedef.test (-131)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/04-ir-missing-nested-enumerators.test (-144)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/05-ir-incorrect-lexical-scope-variable.test (-113)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test (-121)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/07-ir-debug-formats.test (-48)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/08-ir-multiple-compile-units.test (-168)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-1.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-2.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-3.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit.ll (-34)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/hello-world-clang.ll (-49)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-43860-clang.ll (-92)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-44884-clang.ll (-98)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-46466-clang.ll (-44)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/test-clang-intrinsics.ll (-87)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/test-clang.ll (-83)
  • (modified) llvm/tools/llvm-debuginfo-analyzer/CMakeLists.txt (-2)
  • (modified) llvm/unittests/DebugInfo/LogicalView/CMakeLists.txt (-3)
  • (removed) llvm/unittests/DebugInfo/LogicalView/IRReaderTest.cpp (-362)
  • (modified) llvm/unittests/DebugInfo/LogicalView/Inputs/README.md (-12)
  • (removed) llvm/unittests/DebugInfo/LogicalView/Inputs/test-clang.bc ()
  • (removed) llvm/unittests/DebugInfo/LogicalView/Inputs/test-clang.ll (-83)
diff --git a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
index 221732775e74c..6fcf8423e8125 100644
--- a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
+++ b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
@@ -13,11 +13,10 @@ SYNOPSIS
 DESCRIPTION
 -----------
 :program:`llvm-debuginfo-analyzer` parses debug and text sections in
-binary object files or LLVM IR textual / bitcode representation and prints
-their contents in a logical view, which is a human readable representation
-that closely matches the structure of the original user source code.
-Supported object file formats include ELF, Mach-O, WebAssembly, PDB,
-COFF and IR (textual representation and bitcode).
+binary object files and prints their contents in a logical view, which
+is a human-readable representation that closely matches the structure
+of the original user source code. Supported object file formats include
+ELF, Mach-O, WebAssembly, PDB and COFF.
 
 The **logical view** abstracts the complexity associated with the
 different low-level representations of the debugging information that
@@ -2132,95 +2131,143 @@ layout and given the number of matches.
   -----------------------------
   Total           71          8
 
-LLVM IR (textual / bitcode representation) 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):
+COMPARISON MODE
+^^^^^^^^^^^^^^^
+Given the previous example we found the above debug information issue
+(related to the previous invalid scope location for the **'typedef int
+INTEGER'**) by comparing against another compiler.
 
-.. code-block:: c++
+Using GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
+with the printing mode to obtain the following logical view output.
 
-  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  }
+.. code-block:: none
 
-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.
+  llvm-debuginfo-analyzer --attribute=level
+                          --select-regex --select-nocase --select=INTe
+                          --report=list
+                          --print=symbols,types
+                          test-clang.o test-dwarf-gcc.o
+
+  Logical View:
+  [000]           {File} 'test-clang.o'
+
+  [001]           {CompileUnit} 'test.cpp'
+  [003]     4     {TypeAlias} 'INTEGER' -> 'int'
+  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
+
+  Logical View:
+  [000]           {File} 'test-dwarf-gcc.o'
+
+  [001]           {CompileUnit} 'test.cpp'
+  [004]     4     {TypeAlias} 'INTEGER' -> 'int'
+  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
+
+The output shows that both objects contain the same elements. But the
+**'typedef INTEGER'** is located at different scope level. The GCC
+generated object, shows **'4'**, which is the correct value.
+
+There are 2 comparison methods: logical view and logical elements.
+
+LOGICAL VIEW
+""""""""""""
+It compares the logical view as a whole unit; for a match, each compared
+logical element must have the same parents and children.
+
+The output shows in view form the **missing (-), added (+)** elements,
+giving more context by swapping the reference and target object files.
 
 .. code-block:: none
 
-  llvm-debuginfo-analyzer --attribute=level,format
-                          --output-sort=offset
-                          --print=scopes,symbols,types,lines,instructions
-                          test-clang.ll
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=view
+                          --print=symbols,types
+                          test-clang.o test-dwarf-gcc.o
 
-or
+  Reference: 'test-clang.o'
+  Target:    'test-dwarf-gcc.o'
+
+  Logical View:
+   [000]           {File} 'test-clang.o'
+
+   [001]             {CompileUnit} 'test.cpp'
+   [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
+   [002]     2         {Function} extern not_inlined 'foo' -> 'int'
+   [003]                 {Block}
+   [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
+  +[004]     4             {TypeAlias} 'INTEGER' -> 'int'
+   [003]     2           {Parameter} 'ParamBool' -> 'bool'
+   [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
+   [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
+  -[003]     4           {TypeAlias} 'INTEGER' -> 'int'
+
+The output shows the merging view path (reference and target) with the
+missing and added elements.
+
+LOGICAL ELEMENTS
+""""""""""""""""
+It compares individual logical elements without considering if their
+parents are the same. For both comparison methods, the equal criteria
+includes the name, source code location, type, lexical scope level.
 
 .. code-block:: none
 
-  llvm-debuginfo-analyzer --attribute=level,format
-                          --output-sort=offset
-                          --print=elements
-                          test-clang.ll
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=list
+                          --print=symbols,types,summary
+                          test-clang.o test-dwarf-gcc.o
 
-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.
+  Reference: 'test-clang.o'
+  Target:    'test-dwarf-gcc.o'
+
+  (1) Missing Types:
+  -[003]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  (1) Added Types:
+  +[004]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  ----------------------------------------
+  Element   Expected    Missing      Added
+  ----------------------------------------
+  Scopes           4          0          0
+  Symbols          0          0          0
+  Types            2          1          1
+  Lines            0          0          0
+  ----------------------------------------
+  Total            6          1          1
+
+Changing the *Reference* and *Target* order:
 
 .. code-block:: none
 
-  Logical View:
-  [000]           {File} 'test-clang.ll' -> Textual IR
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=list
+                          --print=symbols,types,summary
+                          test-dwarf-gcc.o test-clang.o
 
-  [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'
+  Reference: 'test-dwarf-gcc.o'
+  Target:    'test-clang.o'
+
+  (1) Missing Types:
+  -[004]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  (1) Added Types:
+  +[003]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  ----------------------------------------
+  Element   Expected    Missing      Added
+  ----------------------------------------
+  Scopes           4          0          0
+  Symbols          0          0          0
+  Types            2          1          1
+  Lines            0          0          0
+  ----------------------------------------
+  Total            6          1          1
+
+As the *Reference* and *Target* are switched, the *Added Types* from
+the first case now are listed as *Missing Types*.
 
 EXIT STATUS
 -----------
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
index 793a66e40b02b..34bace886a15f 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
@@ -374,13 +374,6 @@ class LLVM_ABI LVElement : public LVObject {
   // Report the current element as missing or added during comparison.
   virtual void report(LVComparePass Pass) {}
 
-  // Print the basic and extra information. Used mainly to debug IR.
-  void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-  void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
-
   static LVElementDispatch &getDispatch() { return Dispatch; }
 };
 
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
index 6bf7f9d2105f8..090af54cd1b85 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
@@ -159,13 +159,6 @@ class LLVM_ABI LVLocation : public LVObject {
 
   void print(raw_ostream &OS, bool Full = true) const override;
   void printExtra(raw_ostream &OS, bool Full = true) const override;
-
-  // Print the basic and extra information. Used mainly to debug IR.
-  void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-  void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
 };
 
 class LLVM_ABI LVLocationSymbol final : public LVLocation {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
index 774318cb3c53e..371bffb2ed163 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
@@ -193,9 +193,6 @@ class LLVM_ABI LVReader {
   virtual Error printMatchedElements(bool UseMatchedElements);
   virtual void sortScopes() {}
 
-  void printCollectedElements(LVScope *Root);
-  bool checkIntegrityScopesTree(LVScope *Root);
-
 public:
   LVReader() = delete;
   LVReader(StringRef InputFilename, StringRef FileFormatName, ScopedPrinter &W,
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 756bb18aeff12..eec5df19ff843 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -119,20 +119,7 @@ template <typename T> class LVProperties {
 #define KIND_3(ENUM, FIELD, F1, F2, F3)                                        \
   BOOL_BIT_3(Kinds, ENUM, FIELD, F1, F2, F3)
 
-static constexpr int DEC_WIDTH = 8;
-inline FormattedNumber decValue(uint64_t N, unsigned Width = DEC_WIDTH) {
-  return format_decimal(N, Width);
-}
-
-// Output the decimal representation of 'Value'.
-inline std::string decString(uint64_t Value, size_t Width = DEC_WIDTH) {
-  std::string String;
-  raw_string_ostream Stream(String);
-  Stream << decValue(Value, Width);
-  return String;
-}
-
-static constexpr int HEX_WIDTH = 12;
+const int HEX_WIDTH = 12;
 inline FormattedNumber hexValue(uint64_t N, unsigned Width = HEX_WIDTH,
                                 bool Upper = false) {
   return format_hex(N, Width, Upper);
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
index 3336c9415927c..f6dc65f39c7ac 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
@@ -17,7 +17,6 @@
 #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
 #include "llvm/Object/Archive.h"
-#include "llvm/Object/IRObjectFile.h"
 #include "llvm/Object/MachOUniversal.h"
 #include "llvm/Object/ObjectFile.h"
 #include "llvm/Support/Compiler.h"
@@ -31,9 +30,7 @@ namespace logicalview {
 
 using LVReaders = std::vector<std::unique_ptr<LVReader>>;
 using ArgVector = std::vector<std::string>;
-using InputHandle =
-    PointerUnion<object::ObjectFile *, pdb::PDBFile *, object::IRObjectFile *,
-                 MemoryBufferRef *, StringRef *>;
+using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
 
 // This class performs the following tasks:
 // - Creates a logical reader for every binary file in the command line,
@@ -64,10 +61,8 @@ class LVReaderHandler {
                      object::Binary &Binary);
   Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
                      StringRef ExePath);
-  Error handleObject(LVReaders &Readers, StringRef Filename,
-                     MemoryBufferRef Buffer);
 
-  Error createReader(StringRef Filename, LVReaders &Readers, InputHandle &Input,
+  Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
                      StringRef FileFormatName, StringRef ExePath = {});
 
 public:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
index f5590ad40c993..64389902ea6fd 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
@@ -26,7 +26,6 @@
 #include "llvm/MC/MCTargetOptions.h"
 #include "llvm/MC/TargetRegistry.h"
 #include "llvm/Object/COFF.h"
-#include "llvm/Object/IRObjectFile.h"
 #include "llvm/Object/ObjectFile.h"
 
 namespace llvm {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
deleted file mode 100644
index bb5fe7c7a4076..0000000000000
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
+++ /dev/null
@@ -1,302 +0,0 @@
-//===-- LVIRReader.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the LVIRReader class, which is used to describe a
-// LLVM IR reader.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-
-#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
-#include "llvm/Transforms/Utils/DebugSSAUpdater.h"
-
-namespace llvm {
-class DIFile;
-class DINode;
-class DILocation;
-class DIScope;
-class DISubprogram;
-class DIVariable;
-class BasicBlock;
-class Module;
-
-namespace object {
-class IRObjectFile;
-}
-
-namespace logicalview {
-
-class LVElement;
-class LVLine;
-class LVScopeCompileUnit;
-class LVSymbol;
-class LVType;
-struct LVSourceLanguage;
-
-class LVIRReader final : public LVReader {
-  PointerUnion<object::IRObjectFile *, MemoryBufferRef *> InputFile;
-
-  // Used by the metadata 'dump' functions, so the metadata nodes will be
-  // numbered canonically; otherwise, pointer addresses are substituted.
-  Module *TheModule = nullptr;
-
-  // Symbols with locations for current compile unit.
-  LVSymbols SymbolsWithLocations;
-
-  const DICompileUnit *CUNode = nullptr;
-
-  // The Dwarf version (from the module flags).
-  unsigned DwarfVersion = 0;
-
-  // Location index for global variables.
-  uint64_t PoolAddressIndex = 0;
-
-  // Default lower bound for arrays.
-  int64_t DefaultLowerBound = 0;
-
-  // Whether to emit all linkage names, or just abstract subprograms.
-  bool UseAllLinkageNames = true;
-
-  SSAValueNameMap ValueNameMap;
-  DenseMap<void *, uint64_t> InstrLineAddrMap;
-  std::unique_ptr<DbgValueRangeTable> DbgValueRanges;
-
-  // Record the last assigned file index for each compile unit.
-  // This data structure is to aid mapping DIFiles onto a DWARF-like file table.
-  using LVIndexFiles = std::unordered_map<LVScopeCompileUnit *, size_t>;
-  LVIndexFiles IndexFiles;
-
-  // Store a FileID number for each DIFile seen.
-  using LVCompileUnitFiles = std::unordered_map<const DIFile *, size_t>;
-  LVCompileUnitFiles CompileUnitFiles;
-
-  // Associate the metadata objects to logical elements.
-  using LVMDObjects = std::unordered_map<const MDNode *, LVElement *>;
-  LVMDObjects MDObjects;
-
-  // An anonymous type for index type.
-  LVType *NodeIndexType = nullptr;
-
-  // Looking at IR generated with the '-gdwarf -gsplit-dwarf=split' the only
-  // difference is setting the 'DICompileUnit::splitDebugFilename' to the
-  // name of the split filename: "xxx.dwo".
-  bool includeMinimalInlineScopes() const;
-  bool useAllLinkageNames() const { return UseAllLinkageNames; }
-
-  int64_t getDefaultLowerBound() const { return DefaultLowerBound; }
-  void setDefaultLowerBound(LVSourceLanguage *SL);
-
-  // We assume a constant instruction-size increase between instructions.
-  static constexpr unsigned OFFSET_INCREASE = 4;
-  void updateLineOffset() { CurrentOffset += OFFSET_INCREASE; }
-
-  void updateFileIndex(LVScopeCompileUnit *CompileUnit, size_t FileIndex) {
-    auto [Iter, Inserted] = IndexFiles.try_emplace(CompileUnit, FileIndex);
-    if (!Inserted)
-      Iter->second = FileIndex;
-  }
-
-  // Get the current assigned index file for the given compile unit.
-  size_t getFileIndex(LVScopeCompileUnit *CompileUnit) {
-    LVIndexFiles::iterator Iter = IndexFiles.find(CompileUnit);
-    return Iter != IndexFiles.end() ? Iter->second : 0;
-  }
-
-  // For the given 'DIFile', generate a 1-based index to indicate the
-  // source file where the logical element is declared.
-  // The IR reader expects the indexes to be 1-based.
-  // Each compile unit, keeps track of the last assigned index.
-  size_t getOrCreateSourceID(const DIFile *File);
-
-  void addMD(const MDNode *MD, LVElement *Element) {
-    MDObjects.try_emplace(MD, Element);
-  }
-  LVElement *getElementForSeenMD(const MDNode *MD) const {
-    LVMDObjects::const_iterator Iter = MDObjects.find(MD);
-    return Iter != MDObjects.end() ? Iter->second : nullptr;
-  }
-  LVScope *getScopeForSeenMD(const MDNode *MD) const {
-    return static_cast<LVScope *>(getElementForSeenMD(MD));
-  }
-  LVSymbol *getSymbo...
[truncated]

@llvmorg-github-actions

Copy link
Copy Markdown

@llvm/pr-subscribers-llvm-transforms

Author: Carlos Alberto Enciso (CarlosAlbertoEnciso)

Changes

This reverts commit 6bbbf74.

There are link issues with some buildbots.


Patch is 239.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/199890.diff

41 Files Affected:

  • (modified) llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst (+126-79)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h (-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h (-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h (-3)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h (+1-14)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h (+2-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h (-1)
  • (removed) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h (-302)
  • (modified) llvm/lib/DebugInfo/LogicalView/CMakeLists.txt (-2)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVElement.cpp (+4-13)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVLocation.cpp (-5)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp (+1-29)
  • (modified) llvm/lib/DebugInfo/LogicalView/LVReaderHandler.cpp (+8-32)
  • (removed) llvm/lib/DebugInfo/LogicalView/Readers/LVIRReader.cpp (-2630)
  • (modified) llvm/lib/Transforms/Utils/DebugSSAUpdater.cpp (+2-9)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-compare-logical-elements.test (-121)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test (-78)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test (-151)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test (-60)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/03-ir-incorrect-lexical-scope-typedef.test (-131)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/04-ir-missing-nested-enumerators.test (-144)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/05-ir-incorrect-lexical-scope-variable.test (-113)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test (-121)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/07-ir-debug-formats.test (-48)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/08-ir-multiple-compile-units.test (-168)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-1.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-2.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-3.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit.ll (-34)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/hello-world-clang.ll (-49)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-43860-clang.ll (-92)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-44884-clang.ll (-98)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-46466-clang.ll (-44)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/test-clang-intrinsics.ll (-87)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/test-clang.ll (-83)
  • (modified) llvm/tools/llvm-debuginfo-analyzer/CMakeLists.txt (-2)
  • (modified) llvm/unittests/DebugInfo/LogicalView/CMakeLists.txt (-3)
  • (removed) llvm/unittests/DebugInfo/LogicalView/IRReaderTest.cpp (-362)
  • (modified) llvm/unittests/DebugInfo/LogicalView/Inputs/README.md (-12)
  • (removed) llvm/unittests/DebugInfo/LogicalView/Inputs/test-clang.bc ()
  • (removed) llvm/unittests/DebugInfo/LogicalView/Inputs/test-clang.ll (-83)
diff --git a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
index 221732775e74c..6fcf8423e8125 100644
--- a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
+++ b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
@@ -13,11 +13,10 @@ SYNOPSIS
 DESCRIPTION
 -----------
 :program:`llvm-debuginfo-analyzer` parses debug and text sections in
-binary object files or LLVM IR textual / bitcode representation and prints
-their contents in a logical view, which is a human readable representation
-that closely matches the structure of the original user source code.
-Supported object file formats include ELF, Mach-O, WebAssembly, PDB,
-COFF and IR (textual representation and bitcode).
+binary object files and prints their contents in a logical view, which
+is a human-readable representation that closely matches the structure
+of the original user source code. Supported object file formats include
+ELF, Mach-O, WebAssembly, PDB and COFF.
 
 The **logical view** abstracts the complexity associated with the
 different low-level representations of the debugging information that
@@ -2132,95 +2131,143 @@ layout and given the number of matches.
   -----------------------------
   Total           71          8
 
-LLVM IR (textual / bitcode representation) 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):
+COMPARISON MODE
+^^^^^^^^^^^^^^^
+Given the previous example we found the above debug information issue
+(related to the previous invalid scope location for the **'typedef int
+INTEGER'**) by comparing against another compiler.
 
-.. code-block:: c++
+Using GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
+with the printing mode to obtain the following logical view output.
 
-  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  }
+.. code-block:: none
 
-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.
+  llvm-debuginfo-analyzer --attribute=level
+                          --select-regex --select-nocase --select=INTe
+                          --report=list
+                          --print=symbols,types
+                          test-clang.o test-dwarf-gcc.o
+
+  Logical View:
+  [000]           {File} 'test-clang.o'
+
+  [001]           {CompileUnit} 'test.cpp'
+  [003]     4     {TypeAlias} 'INTEGER' -> 'int'
+  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
+
+  Logical View:
+  [000]           {File} 'test-dwarf-gcc.o'
+
+  [001]           {CompileUnit} 'test.cpp'
+  [004]     4     {TypeAlias} 'INTEGER' -> 'int'
+  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
+
+The output shows that both objects contain the same elements. But the
+**'typedef INTEGER'** is located at different scope level. The GCC
+generated object, shows **'4'**, which is the correct value.
+
+There are 2 comparison methods: logical view and logical elements.
+
+LOGICAL VIEW
+""""""""""""
+It compares the logical view as a whole unit; for a match, each compared
+logical element must have the same parents and children.
+
+The output shows in view form the **missing (-), added (+)** elements,
+giving more context by swapping the reference and target object files.
 
 .. code-block:: none
 
-  llvm-debuginfo-analyzer --attribute=level,format
-                          --output-sort=offset
-                          --print=scopes,symbols,types,lines,instructions
-                          test-clang.ll
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=view
+                          --print=symbols,types
+                          test-clang.o test-dwarf-gcc.o
 
-or
+  Reference: 'test-clang.o'
+  Target:    'test-dwarf-gcc.o'
+
+  Logical View:
+   [000]           {File} 'test-clang.o'
+
+   [001]             {CompileUnit} 'test.cpp'
+   [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
+   [002]     2         {Function} extern not_inlined 'foo' -> 'int'
+   [003]                 {Block}
+   [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
+  +[004]     4             {TypeAlias} 'INTEGER' -> 'int'
+   [003]     2           {Parameter} 'ParamBool' -> 'bool'
+   [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
+   [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
+  -[003]     4           {TypeAlias} 'INTEGER' -> 'int'
+
+The output shows the merging view path (reference and target) with the
+missing and added elements.
+
+LOGICAL ELEMENTS
+""""""""""""""""
+It compares individual logical elements without considering if their
+parents are the same. For both comparison methods, the equal criteria
+includes the name, source code location, type, lexical scope level.
 
 .. code-block:: none
 
-  llvm-debuginfo-analyzer --attribute=level,format
-                          --output-sort=offset
-                          --print=elements
-                          test-clang.ll
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=list
+                          --print=symbols,types,summary
+                          test-clang.o test-dwarf-gcc.o
 
-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.
+  Reference: 'test-clang.o'
+  Target:    'test-dwarf-gcc.o'
+
+  (1) Missing Types:
+  -[003]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  (1) Added Types:
+  +[004]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  ----------------------------------------
+  Element   Expected    Missing      Added
+  ----------------------------------------
+  Scopes           4          0          0
+  Symbols          0          0          0
+  Types            2          1          1
+  Lines            0          0          0
+  ----------------------------------------
+  Total            6          1          1
+
+Changing the *Reference* and *Target* order:
 
 .. code-block:: none
 
-  Logical View:
-  [000]           {File} 'test-clang.ll' -> Textual IR
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=list
+                          --print=symbols,types,summary
+                          test-dwarf-gcc.o test-clang.o
 
-  [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'
+  Reference: 'test-dwarf-gcc.o'
+  Target:    'test-clang.o'
+
+  (1) Missing Types:
+  -[004]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  (1) Added Types:
+  +[003]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  ----------------------------------------
+  Element   Expected    Missing      Added
+  ----------------------------------------
+  Scopes           4          0          0
+  Symbols          0          0          0
+  Types            2          1          1
+  Lines            0          0          0
+  ----------------------------------------
+  Total            6          1          1
+
+As the *Reference* and *Target* are switched, the *Added Types* from
+the first case now are listed as *Missing Types*.
 
 EXIT STATUS
 -----------
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
index 793a66e40b02b..34bace886a15f 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
@@ -374,13 +374,6 @@ class LLVM_ABI LVElement : public LVObject {
   // Report the current element as missing or added during comparison.
   virtual void report(LVComparePass Pass) {}
 
-  // Print the basic and extra information. Used mainly to debug IR.
-  void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-  void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
-
   static LVElementDispatch &getDispatch() { return Dispatch; }
 };
 
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
index 6bf7f9d2105f8..090af54cd1b85 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
@@ -159,13 +159,6 @@ class LLVM_ABI LVLocation : public LVObject {
 
   void print(raw_ostream &OS, bool Full = true) const override;
   void printExtra(raw_ostream &OS, bool Full = true) const override;
-
-  // Print the basic and extra information. Used mainly to debug IR.
-  void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-  void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
 };
 
 class LLVM_ABI LVLocationSymbol final : public LVLocation {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
index 774318cb3c53e..371bffb2ed163 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
@@ -193,9 +193,6 @@ class LLVM_ABI LVReader {
   virtual Error printMatchedElements(bool UseMatchedElements);
   virtual void sortScopes() {}
 
-  void printCollectedElements(LVScope *Root);
-  bool checkIntegrityScopesTree(LVScope *Root);
-
 public:
   LVReader() = delete;
   LVReader(StringRef InputFilename, StringRef FileFormatName, ScopedPrinter &W,
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 756bb18aeff12..eec5df19ff843 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -119,20 +119,7 @@ template <typename T> class LVProperties {
 #define KIND_3(ENUM, FIELD, F1, F2, F3)                                        \
   BOOL_BIT_3(Kinds, ENUM, FIELD, F1, F2, F3)
 
-static constexpr int DEC_WIDTH = 8;
-inline FormattedNumber decValue(uint64_t N, unsigned Width = DEC_WIDTH) {
-  return format_decimal(N, Width);
-}
-
-// Output the decimal representation of 'Value'.
-inline std::string decString(uint64_t Value, size_t Width = DEC_WIDTH) {
-  std::string String;
-  raw_string_ostream Stream(String);
-  Stream << decValue(Value, Width);
-  return String;
-}
-
-static constexpr int HEX_WIDTH = 12;
+const int HEX_WIDTH = 12;
 inline FormattedNumber hexValue(uint64_t N, unsigned Width = HEX_WIDTH,
                                 bool Upper = false) {
   return format_hex(N, Width, Upper);
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
index 3336c9415927c..f6dc65f39c7ac 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
@@ -17,7 +17,6 @@
 #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
 #include "llvm/Object/Archive.h"
-#include "llvm/Object/IRObjectFile.h"
 #include "llvm/Object/MachOUniversal.h"
 #include "llvm/Object/ObjectFile.h"
 #include "llvm/Support/Compiler.h"
@@ -31,9 +30,7 @@ namespace logicalview {
 
 using LVReaders = std::vector<std::unique_ptr<LVReader>>;
 using ArgVector = std::vector<std::string>;
-using InputHandle =
-    PointerUnion<object::ObjectFile *, pdb::PDBFile *, object::IRObjectFile *,
-                 MemoryBufferRef *, StringRef *>;
+using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
 
 // This class performs the following tasks:
 // - Creates a logical reader for every binary file in the command line,
@@ -64,10 +61,8 @@ class LVReaderHandler {
                      object::Binary &Binary);
   Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
                      StringRef ExePath);
-  Error handleObject(LVReaders &Readers, StringRef Filename,
-                     MemoryBufferRef Buffer);
 
-  Error createReader(StringRef Filename, LVReaders &Readers, InputHandle &Input,
+  Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
                      StringRef FileFormatName, StringRef ExePath = {});
 
 public:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
index f5590ad40c993..64389902ea6fd 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
@@ -26,7 +26,6 @@
 #include "llvm/MC/MCTargetOptions.h"
 #include "llvm/MC/TargetRegistry.h"
 #include "llvm/Object/COFF.h"
-#include "llvm/Object/IRObjectFile.h"
 #include "llvm/Object/ObjectFile.h"
 
 namespace llvm {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
deleted file mode 100644
index bb5fe7c7a4076..0000000000000
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
+++ /dev/null
@@ -1,302 +0,0 @@
-//===-- LVIRReader.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the LVIRReader class, which is used to describe a
-// LLVM IR reader.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-
-#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
-#include "llvm/Transforms/Utils/DebugSSAUpdater.h"
-
-namespace llvm {
-class DIFile;
-class DINode;
-class DILocation;
-class DIScope;
-class DISubprogram;
-class DIVariable;
-class BasicBlock;
-class Module;
-
-namespace object {
-class IRObjectFile;
-}
-
-namespace logicalview {
-
-class LVElement;
-class LVLine;
-class LVScopeCompileUnit;
-class LVSymbol;
-class LVType;
-struct LVSourceLanguage;
-
-class LVIRReader final : public LVReader {
-  PointerUnion<object::IRObjectFile *, MemoryBufferRef *> InputFile;
-
-  // Used by the metadata 'dump' functions, so the metadata nodes will be
-  // numbered canonically; otherwise, pointer addresses are substituted.
-  Module *TheModule = nullptr;
-
-  // Symbols with locations for current compile unit.
-  LVSymbols SymbolsWithLocations;
-
-  const DICompileUnit *CUNode = nullptr;
-
-  // The Dwarf version (from the module flags).
-  unsigned DwarfVersion = 0;
-
-  // Location index for global variables.
-  uint64_t PoolAddressIndex = 0;
-
-  // Default lower bound for arrays.
-  int64_t DefaultLowerBound = 0;
-
-  // Whether to emit all linkage names, or just abstract subprograms.
-  bool UseAllLinkageNames = true;
-
-  SSAValueNameMap ValueNameMap;
-  DenseMap<void *, uint64_t> InstrLineAddrMap;
-  std::unique_ptr<DbgValueRangeTable> DbgValueRanges;
-
-  // Record the last assigned file index for each compile unit.
-  // This data structure is to aid mapping DIFiles onto a DWARF-like file table.
-  using LVIndexFiles = std::unordered_map<LVScopeCompileUnit *, size_t>;
-  LVIndexFiles IndexFiles;
-
-  // Store a FileID number for each DIFile seen.
-  using LVCompileUnitFiles = std::unordered_map<const DIFile *, size_t>;
-  LVCompileUnitFiles CompileUnitFiles;
-
-  // Associate the metadata objects to logical elements.
-  using LVMDObjects = std::unordered_map<const MDNode *, LVElement *>;
-  LVMDObjects MDObjects;
-
-  // An anonymous type for index type.
-  LVType *NodeIndexType = nullptr;
-
-  // Looking at IR generated with the '-gdwarf -gsplit-dwarf=split' the only
-  // difference is setting the 'DICompileUnit::splitDebugFilename' to the
-  // name of the split filename: "xxx.dwo".
-  bool includeMinimalInlineScopes() const;
-  bool useAllLinkageNames() const { return UseAllLinkageNames; }
-
-  int64_t getDefaultLowerBound() const { return DefaultLowerBound; }
-  void setDefaultLowerBound(LVSourceLanguage *SL);
-
-  // We assume a constant instruction-size increase between instructions.
-  static constexpr unsigned OFFSET_INCREASE = 4;
-  void updateLineOffset() { CurrentOffset += OFFSET_INCREASE; }
-
-  void updateFileIndex(LVScopeCompileUnit *CompileUnit, size_t FileIndex) {
-    auto [Iter, Inserted] = IndexFiles.try_emplace(CompileUnit, FileIndex);
-    if (!Inserted)
-      Iter->second = FileIndex;
-  }
-
-  // Get the current assigned index file for the given compile unit.
-  size_t getFileIndex(LVScopeCompileUnit *CompileUnit) {
-    LVIndexFiles::iterator Iter = IndexFiles.find(CompileUnit);
-    return Iter != IndexFiles.end() ? Iter->second : 0;
-  }
-
-  // For the given 'DIFile', generate a 1-based index to indicate the
-  // source file where the logical element is declared.
-  // The IR reader expects the indexes to be 1-based.
-  // Each compile unit, keeps track of the last assigned index.
-  size_t getOrCreateSourceID(const DIFile *File);
-
-  void addMD(const MDNode *MD, LVElement *Element) {
-    MDObjects.try_emplace(MD, Element);
-  }
-  LVElement *getElementForSeenMD(const MDNode *MD) const {
-    LVMDObjects::const_iterator Iter = MDObjects.find(MD);
-    return Iter != MDObjects.end() ? Iter->second : nullptr;
-  }
-  LVScope *getScopeForSeenMD(const MDNode *MD) const {
-    return static_cast<LVScope *>(getElementForSeenMD(MD));
-  }
-  LVSymbol *getSymbo...
[truncated]

@llvmorg-github-actions

Copy link
Copy Markdown

@llvm/pr-subscribers-llvm-binary-utilities

Author: Carlos Alberto Enciso (CarlosAlbertoEnciso)

Changes

This reverts commit 6bbbf74.

There are link issues with some buildbots.


Patch is 239.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/199890.diff

41 Files Affected:

  • (modified) llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst (+126-79)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h (-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h (-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h (-3)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h (+1-14)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h (+2-7)
  • (modified) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h (-1)
  • (removed) llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h (-302)
  • (modified) llvm/lib/DebugInfo/LogicalView/CMakeLists.txt (-2)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVElement.cpp (+4-13)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVLocation.cpp (-5)
  • (modified) llvm/lib/DebugInfo/LogicalView/Core/LVReader.cpp (+1-29)
  • (modified) llvm/lib/DebugInfo/LogicalView/LVReaderHandler.cpp (+8-32)
  • (removed) llvm/lib/DebugInfo/LogicalView/Readers/LVIRReader.cpp (-2630)
  • (modified) llvm/lib/Transforms/Utils/DebugSSAUpdater.cpp (+2-9)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-compare-logical-elements.test (-121)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-print-basic-details.test (-78)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/01-ir-select-logical-elements.test (-151)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/02-ir-logical-lines.test (-60)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/03-ir-incorrect-lexical-scope-typedef.test (-131)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/04-ir-missing-nested-enumerators.test (-144)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/05-ir-incorrect-lexical-scope-variable.test (-113)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/06-ir-full-logical-view.test (-121)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/07-ir-debug-formats.test (-48)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/08-ir-multiple-compile-units.test (-168)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-1.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-2.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit-3.ll (-58)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/compile-unit.ll (-34)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/hello-world-clang.ll (-49)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-43860-clang.ll (-92)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-44884-clang.ll (-98)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/pr-46466-clang.ll (-44)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/test-clang-intrinsics.ll (-87)
  • (removed) llvm/test/tools/llvm-debuginfo-analyzer/IR/Inputs/test-clang.ll (-83)
  • (modified) llvm/tools/llvm-debuginfo-analyzer/CMakeLists.txt (-2)
  • (modified) llvm/unittests/DebugInfo/LogicalView/CMakeLists.txt (-3)
  • (removed) llvm/unittests/DebugInfo/LogicalView/IRReaderTest.cpp (-362)
  • (modified) llvm/unittests/DebugInfo/LogicalView/Inputs/README.md (-12)
  • (removed) llvm/unittests/DebugInfo/LogicalView/Inputs/test-clang.bc ()
  • (removed) llvm/unittests/DebugInfo/LogicalView/Inputs/test-clang.ll (-83)
diff --git a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
index 221732775e74c..6fcf8423e8125 100644
--- a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
+++ b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
@@ -13,11 +13,10 @@ SYNOPSIS
 DESCRIPTION
 -----------
 :program:`llvm-debuginfo-analyzer` parses debug and text sections in
-binary object files or LLVM IR textual / bitcode representation and prints
-their contents in a logical view, which is a human readable representation
-that closely matches the structure of the original user source code.
-Supported object file formats include ELF, Mach-O, WebAssembly, PDB,
-COFF and IR (textual representation and bitcode).
+binary object files and prints their contents in a logical view, which
+is a human-readable representation that closely matches the structure
+of the original user source code. Supported object file formats include
+ELF, Mach-O, WebAssembly, PDB and COFF.
 
 The **logical view** abstracts the complexity associated with the
 different low-level representations of the debugging information that
@@ -2132,95 +2131,143 @@ layout and given the number of matches.
   -----------------------------
   Total           71          8
 
-LLVM IR (textual / bitcode representation) 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):
+COMPARISON MODE
+^^^^^^^^^^^^^^^
+Given the previous example we found the above debug information issue
+(related to the previous invalid scope location for the **'typedef int
+INTEGER'**) by comparing against another compiler.
 
-.. code-block:: c++
+Using GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
+with the printing mode to obtain the following logical view output.
 
-  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  }
+.. code-block:: none
 
-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.
+  llvm-debuginfo-analyzer --attribute=level
+                          --select-regex --select-nocase --select=INTe
+                          --report=list
+                          --print=symbols,types
+                          test-clang.o test-dwarf-gcc.o
+
+  Logical View:
+  [000]           {File} 'test-clang.o'
+
+  [001]           {CompileUnit} 'test.cpp'
+  [003]     4     {TypeAlias} 'INTEGER' -> 'int'
+  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
+
+  Logical View:
+  [000]           {File} 'test-dwarf-gcc.o'
+
+  [001]           {CompileUnit} 'test.cpp'
+  [004]     4     {TypeAlias} 'INTEGER' -> 'int'
+  [004]     5     {Variable} 'CONSTANT' -> 'const INTEGER'
+
+The output shows that both objects contain the same elements. But the
+**'typedef INTEGER'** is located at different scope level. The GCC
+generated object, shows **'4'**, which is the correct value.
+
+There are 2 comparison methods: logical view and logical elements.
+
+LOGICAL VIEW
+""""""""""""
+It compares the logical view as a whole unit; for a match, each compared
+logical element must have the same parents and children.
+
+The output shows in view form the **missing (-), added (+)** elements,
+giving more context by swapping the reference and target object files.
 
 .. code-block:: none
 
-  llvm-debuginfo-analyzer --attribute=level,format
-                          --output-sort=offset
-                          --print=scopes,symbols,types,lines,instructions
-                          test-clang.ll
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=view
+                          --print=symbols,types
+                          test-clang.o test-dwarf-gcc.o
 
-or
+  Reference: 'test-clang.o'
+  Target:    'test-dwarf-gcc.o'
+
+  Logical View:
+   [000]           {File} 'test-clang.o'
+
+   [001]             {CompileUnit} 'test.cpp'
+   [002]     1         {TypeAlias} 'INTPTR' -> '* const int'
+   [002]     2         {Function} extern not_inlined 'foo' -> 'int'
+   [003]                 {Block}
+   [004]     5             {Variable} 'CONSTANT' -> 'const INTEGER'
+  +[004]     4             {TypeAlias} 'INTEGER' -> 'int'
+   [003]     2           {Parameter} 'ParamBool' -> 'bool'
+   [003]     2           {Parameter} 'ParamPtr' -> 'INTPTR'
+   [003]     2           {Parameter} 'ParamUnsigned' -> 'unsigned int'
+  -[003]     4           {TypeAlias} 'INTEGER' -> 'int'
+
+The output shows the merging view path (reference and target) with the
+missing and added elements.
+
+LOGICAL ELEMENTS
+""""""""""""""""
+It compares individual logical elements without considering if their
+parents are the same. For both comparison methods, the equal criteria
+includes the name, source code location, type, lexical scope level.
 
 .. code-block:: none
 
-  llvm-debuginfo-analyzer --attribute=level,format
-                          --output-sort=offset
-                          --print=elements
-                          test-clang.ll
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=list
+                          --print=symbols,types,summary
+                          test-clang.o test-dwarf-gcc.o
 
-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.
+  Reference: 'test-clang.o'
+  Target:    'test-dwarf-gcc.o'
+
+  (1) Missing Types:
+  -[003]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  (1) Added Types:
+  +[004]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  ----------------------------------------
+  Element   Expected    Missing      Added
+  ----------------------------------------
+  Scopes           4          0          0
+  Symbols          0          0          0
+  Types            2          1          1
+  Lines            0          0          0
+  ----------------------------------------
+  Total            6          1          1
+
+Changing the *Reference* and *Target* order:
 
 .. code-block:: none
 
-  Logical View:
-  [000]           {File} 'test-clang.ll' -> Textual IR
+  llvm-debuginfo-analyzer --attribute=level
+                          --compare=types
+                          --report=list
+                          --print=symbols,types,summary
+                          test-dwarf-gcc.o test-clang.o
 
-  [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'
+  Reference: 'test-dwarf-gcc.o'
+  Target:    'test-clang.o'
+
+  (1) Missing Types:
+  -[004]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  (1) Added Types:
+  +[003]     4     {TypeAlias} 'INTEGER' -> 'int'
+
+  ----------------------------------------
+  Element   Expected    Missing      Added
+  ----------------------------------------
+  Scopes           4          0          0
+  Symbols          0          0          0
+  Types            2          1          1
+  Lines            0          0          0
+  ----------------------------------------
+  Total            6          1          1
+
+As the *Reference* and *Target* are switched, the *Added Types* from
+the first case now are listed as *Missing Types*.
 
 EXIT STATUS
 -----------
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
index 793a66e40b02b..34bace886a15f 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
@@ -374,13 +374,6 @@ class LLVM_ABI LVElement : public LVObject {
   // Report the current element as missing or added during comparison.
   virtual void report(LVComparePass Pass) {}
 
-  // Print the basic and extra information. Used mainly to debug IR.
-  void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-  void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
-
   static LVElementDispatch &getDispatch() { return Dispatch; }
 };
 
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
index 6bf7f9d2105f8..090af54cd1b85 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
@@ -159,13 +159,6 @@ class LLVM_ABI LVLocation : public LVObject {
 
   void print(raw_ostream &OS, bool Full = true) const override;
   void printExtra(raw_ostream &OS, bool Full = true) const override;
-
-  // Print the basic and extra information. Used mainly to debug IR.
-  void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
-  void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
 };
 
 class LLVM_ABI LVLocationSymbol final : public LVLocation {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
index 774318cb3c53e..371bffb2ed163 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
@@ -193,9 +193,6 @@ class LLVM_ABI LVReader {
   virtual Error printMatchedElements(bool UseMatchedElements);
   virtual void sortScopes() {}
 
-  void printCollectedElements(LVScope *Root);
-  bool checkIntegrityScopesTree(LVScope *Root);
-
 public:
   LVReader() = delete;
   LVReader(StringRef InputFilename, StringRef FileFormatName, ScopedPrinter &W,
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 756bb18aeff12..eec5df19ff843 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -119,20 +119,7 @@ template <typename T> class LVProperties {
 #define KIND_3(ENUM, FIELD, F1, F2, F3)                                        \
   BOOL_BIT_3(Kinds, ENUM, FIELD, F1, F2, F3)
 
-static constexpr int DEC_WIDTH = 8;
-inline FormattedNumber decValue(uint64_t N, unsigned Width = DEC_WIDTH) {
-  return format_decimal(N, Width);
-}
-
-// Output the decimal representation of 'Value'.
-inline std::string decString(uint64_t Value, size_t Width = DEC_WIDTH) {
-  std::string String;
-  raw_string_ostream Stream(String);
-  Stream << decValue(Value, Width);
-  return String;
-}
-
-static constexpr int HEX_WIDTH = 12;
+const int HEX_WIDTH = 12;
 inline FormattedNumber hexValue(uint64_t N, unsigned Width = HEX_WIDTH,
                                 bool Upper = false) {
   return format_hex(N, Width, Upper);
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
index 3336c9415927c..f6dc65f39c7ac 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
@@ -17,7 +17,6 @@
 #include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
 #include "llvm/DebugInfo/PDB/Native/PDBFile.h"
 #include "llvm/Object/Archive.h"
-#include "llvm/Object/IRObjectFile.h"
 #include "llvm/Object/MachOUniversal.h"
 #include "llvm/Object/ObjectFile.h"
 #include "llvm/Support/Compiler.h"
@@ -31,9 +30,7 @@ namespace logicalview {
 
 using LVReaders = std::vector<std::unique_ptr<LVReader>>;
 using ArgVector = std::vector<std::string>;
-using InputHandle =
-    PointerUnion<object::ObjectFile *, pdb::PDBFile *, object::IRObjectFile *,
-                 MemoryBufferRef *, StringRef *>;
+using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
 
 // This class performs the following tasks:
 // - Creates a logical reader for every binary file in the command line,
@@ -64,10 +61,8 @@ class LVReaderHandler {
                      object::Binary &Binary);
   Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
                      StringRef ExePath);
-  Error handleObject(LVReaders &Readers, StringRef Filename,
-                     MemoryBufferRef Buffer);
 
-  Error createReader(StringRef Filename, LVReaders &Readers, InputHandle &Input,
+  Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
                      StringRef FileFormatName, StringRef ExePath = {});
 
 public:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
index f5590ad40c993..64389902ea6fd 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
@@ -26,7 +26,6 @@
 #include "llvm/MC/MCTargetOptions.h"
 #include "llvm/MC/TargetRegistry.h"
 #include "llvm/Object/COFF.h"
-#include "llvm/Object/IRObjectFile.h"
 #include "llvm/Object/ObjectFile.h"
 
 namespace llvm {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
deleted file mode 100644
index bb5fe7c7a4076..0000000000000
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
+++ /dev/null
@@ -1,302 +0,0 @@
-//===-- LVIRReader.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the LVIRReader class, which is used to describe a
-// LLVM IR reader.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-
-#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
-#include "llvm/Transforms/Utils/DebugSSAUpdater.h"
-
-namespace llvm {
-class DIFile;
-class DINode;
-class DILocation;
-class DIScope;
-class DISubprogram;
-class DIVariable;
-class BasicBlock;
-class Module;
-
-namespace object {
-class IRObjectFile;
-}
-
-namespace logicalview {
-
-class LVElement;
-class LVLine;
-class LVScopeCompileUnit;
-class LVSymbol;
-class LVType;
-struct LVSourceLanguage;
-
-class LVIRReader final : public LVReader {
-  PointerUnion<object::IRObjectFile *, MemoryBufferRef *> InputFile;
-
-  // Used by the metadata 'dump' functions, so the metadata nodes will be
-  // numbered canonically; otherwise, pointer addresses are substituted.
-  Module *TheModule = nullptr;
-
-  // Symbols with locations for current compile unit.
-  LVSymbols SymbolsWithLocations;
-
-  const DICompileUnit *CUNode = nullptr;
-
-  // The Dwarf version (from the module flags).
-  unsigned DwarfVersion = 0;
-
-  // Location index for global variables.
-  uint64_t PoolAddressIndex = 0;
-
-  // Default lower bound for arrays.
-  int64_t DefaultLowerBound = 0;
-
-  // Whether to emit all linkage names, or just abstract subprograms.
-  bool UseAllLinkageNames = true;
-
-  SSAValueNameMap ValueNameMap;
-  DenseMap<void *, uint64_t> InstrLineAddrMap;
-  std::unique_ptr<DbgValueRangeTable> DbgValueRanges;
-
-  // Record the last assigned file index for each compile unit.
-  // This data structure is to aid mapping DIFiles onto a DWARF-like file table.
-  using LVIndexFiles = std::unordered_map<LVScopeCompileUnit *, size_t>;
-  LVIndexFiles IndexFiles;
-
-  // Store a FileID number for each DIFile seen.
-  using LVCompileUnitFiles = std::unordered_map<const DIFile *, size_t>;
-  LVCompileUnitFiles CompileUnitFiles;
-
-  // Associate the metadata objects to logical elements.
-  using LVMDObjects = std::unordered_map<const MDNode *, LVElement *>;
-  LVMDObjects MDObjects;
-
-  // An anonymous type for index type.
-  LVType *NodeIndexType = nullptr;
-
-  // Looking at IR generated with the '-gdwarf -gsplit-dwarf=split' the only
-  // difference is setting the 'DICompileUnit::splitDebugFilename' to the
-  // name of the split filename: "xxx.dwo".
-  bool includeMinimalInlineScopes() const;
-  bool useAllLinkageNames() const { return UseAllLinkageNames; }
-
-  int64_t getDefaultLowerBound() const { return DefaultLowerBound; }
-  void setDefaultLowerBound(LVSourceLanguage *SL);
-
-  // We assume a constant instruction-size increase between instructions.
-  static constexpr unsigned OFFSET_INCREASE = 4;
-  void updateLineOffset() { CurrentOffset += OFFSET_INCREASE; }
-
-  void updateFileIndex(LVScopeCompileUnit *CompileUnit, size_t FileIndex) {
-    auto [Iter, Inserted] = IndexFiles.try_emplace(CompileUnit, FileIndex);
-    if (!Inserted)
-      Iter->second = FileIndex;
-  }
-
-  // Get the current assigned index file for the given compile unit.
-  size_t getFileIndex(LVScopeCompileUnit *CompileUnit) {
-    LVIndexFiles::iterator Iter = IndexFiles.find(CompileUnit);
-    return Iter != IndexFiles.end() ? Iter->second : 0;
-  }
-
-  // For the given 'DIFile', generate a 1-based index to indicate the
-  // source file where the logical element is declared.
-  // The IR reader expects the indexes to be 1-based.
-  // Each compile unit, keeps track of the last assigned index.
-  size_t getOrCreateSourceID(const DIFile *File);
-
-  void addMD(const MDNode *MD, LVElement *Element) {
-    MDObjects.try_emplace(MD, Element);
-  }
-  LVElement *getElementForSeenMD(const MDNode *MD) const {
-    LVMDObjects::const_iterator Iter = MDObjects.find(MD);
-    return Iter != MDObjects.end() ? Iter->second : nullptr;
-  }
-  LVScope *getScopeForSeenMD(const MDNode *MD) const {
-    return static_cast<LVScope *>(getElementForSeenMD(MD));
-  }
-  LVSymbol *getSymbo...
[truncated]

@CarlosAlbertoEnciso
CarlosAlbertoEnciso enabled auto-merge (squash) May 27, 2026 06:49
@CarlosAlbertoEnciso
CarlosAlbertoEnciso merged commit 6de9a33 into llvm:main May 27, 2026
12 of 15 checks passed
CarlosAlbertoEnciso added a commit that referenced this pull request Jun 2, 2026
llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands #135440, which was
reverted in #199890.
It includes the fixes for the buildbots problems.
llvm-sync Bot pushed a commit to arm/arm-toolchain that referenced this pull request Jun 2, 2026
…(#200603)

llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm/llvm-project#135440, which was
reverted in llvm/llvm-project#199890.
It includes the fixes for the buildbots problems.
llvm-upstreamsync Bot pushed a commit to qualcomm/cpullvm-toolchain that referenced this pull request Jun 2, 2026
…(#200603)

llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm/llvm-project#135440, which was
reverted in llvm/llvm-project#199890.
It includes the fixes for the buildbots problems.
yingopq pushed a commit to yingopq/llvm-project that referenced this pull request Jun 5, 2026
llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm#135440, which was
reverted in llvm#199890.
It includes the fixes for the buildbots problems.
CarlosAlbertoEnciso added a commit that referenced this pull request Jul 1, 2026
llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands #135440,
which was:
reverted in: #199890
relanded in: #200603
reverted in: #201019

It includes the fixes for the buildbots problems.
llvm-sync Bot pushed a commit to arm/arm-toolchain that referenced this pull request Jul 1, 2026
…(#202120)

llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm/llvm-project#135440,
which was:
reverted in: llvm/llvm-project#199890
relanded in: llvm/llvm-project#200603
reverted in: llvm/llvm-project#201019

It includes the fixes for the buildbots problems.
llvm-upstreamsync Bot pushed a commit to qualcomm/cpullvm-toolchain that referenced this pull request Jul 1, 2026
…(#202120)

llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm/llvm-project#135440,
which was:
reverted in: llvm/llvm-project#199890
relanded in: llvm/llvm-project#200603
reverted in: llvm/llvm-project#201019

It includes the fixes for the buildbots problems.
llvm-upstream-sync Bot pushed a commit to sriyalamar/cpullvm-toolchain that referenced this pull request Jul 1, 2026
…(#202120)

llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm/llvm-project#135440,
which was:
reverted in: llvm/llvm-project#199890
relanded in: llvm/llvm-project#200603
reverted in: llvm/llvm-project#201019

It includes the fixes for the buildbots problems.
maarcosrmz pushed a commit to maarcosrmz/llvm-project that referenced this pull request Jul 1, 2026
llvm-debuginfo-analyzer is a command line tool that processes debug
info contained in a binary file and produces a debug information
format agnostic “Logical View”, which is a high-level semantic
representation of the debug info, independent of the low-level format.

Add support for the LLVM IR format and be able to generate logical
views. Both textual representation (.ll) and bitcode (.bc) formats
are supported.

This relands llvm#135440,
which was:
reverted in: llvm#199890
relanded in: llvm#200603
reverted in: llvm#201019

It includes the fixes for the buildbots problems.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant