DebugIR pass fails with an assert

Hi List,

My IR compiles fine and runs. I’ve tried to add DebugIR pass so
as to be able to debug and profile it (since source is an SQL query
all that I can debug and profile is IR itself).

When I tried to add it to pass manager I got the following assert:

Program received signal SIGABRT, Aborted.
0x00007ffff3fe4425 in __GI_raise (sig=) at …/nptl/sysdeps/unix/sysv/linux/raise.c:64
64 …/nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0 0x00007ffff3fe4425 in __GI_raise (sig=)
at …/nptl/sysdeps/unix/sysv/linux/raise.c:64
#1 0x00007ffff3fe7b8b in __GI_abort () at abort.c:91
#2 0x00007ffff3fdd0ee in __assert_fail_base (fmt=,
assertion=0x7fffef586208 “!isLiteral() && “Literal structs never have names””,
file=0x7fffef585fb0 “/home/kolkhovskiy/3rdparty/llvm/lib/IR/Type.cpp”, line=,
function=) at assert.c:94
#3 0x00007ffff3fdd192 in __GI___assert_fail (
assertion=0x7fffef586208 “!isLiteral() && “Literal structs never have names””,
file=0x7fffef585fb0 “/home/kolkhovskiy/3rdparty/llvm/lib/IR/Type.cpp”, line=581,
function=0x7fffef589380 “llvm::StringRef llvm::StructType::getName() const”) at assert.c:103
#4 0x00007fffef4e1755 in llvm::StructType::getName (this=0x6562c0)
at /home/kolkhovskiy/3rdparty/llvm/lib/IR/Type.cpp:581
#5 0x00007fffef4e0030 in llvm::Type::getStructName (this=0x6562c0)
at /home/kolkhovskiy/3rdparty/llvm/lib/IR/Type.cpp:195
#6 0x00007ffff2ec85b9 in (anonymous namespace)::DIUpdater::getOrCreateType (this=0x7fffffffd530,
T=0x6562c0) at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:387
#7 0x00007ffff2ec8a1d in (anonymous namespace)::DIUpdater::getOrCreateType (this=0x7fffffffd530,
T=0x6565e0) at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:415
#8 0x00007ffff2ec88db in (anonymous namespace)::DIUpdater::getOrCreateType (this=0x7fffffffd530,
T=0x656630) at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:406
#9 0x00007ffff2ec8cf0 in (anonymous namespace)::DIUpdater::createFunctionSignature (
this=0x7fffffffd530, Func=0x672a10)
at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:441
#10 0x00007ffff2ec729f in (anonymous namespace)::DIUpdater::visitFunction (this=0x7fffffffd530, F=…)
at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:196
#11 0x00007ffff2eca2cc in llvm::InstVisitor<{anonymous}::DIUpdater, void>::visit(llvm::Function &) (
this=0x7fffffffd530, F=…) at /home/kolkhovskiy/3rdparty/llvm/include/llvm/InstVisitor.h:102
#12 0x00007ffff2eca1d7 in llvm::InstVisitor<{anonymous}::DIUpdater, void>::visit<llvm::ilist_iteratorllvm::Function >(llvm::ilist_iteratorllvm::Function, llvm::ilist_iteratorllvm::Function) (
this=0x7fffffffd530, Start=…, End=…)
at /home/kolkhovskiy/3rdparty/llvm/include/llvm/InstVisitor.h:92
#13 0x00007ffff2eca0a6 in llvm::InstVisitor<{anonymous}::DIUpdater, void>::visit(llvm::Module &) (
this=0x7fffffffd530, M=…) at /home/kolkhovskiy/3rdparty/llvm/include/llvm/InstVisitor.h:99
#14 0x00007ffff2ec9f97 in llvm::InstVisitor<{anonymous}::DIUpdater, void>::visit(llvm::Module *) (
this=0x7fffffffd530, M=0x626360) at /home/kolkhovskiy/3rdparty/llvm/include/llvm/InstVisitor.h:111
#15 0x00007ffff2ec70dc in (anonymous namespace)::DIUpdater::DIUpdater (this=0x7fffffffd530, M=…,
Filename=…, Directory=…, DisplayM=0x0, VMap=0x0)
at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:178
#16 0x00007ffff2ec9a96 in llvm::DebugIR::createDebugInfo (this=0x67e0e0, M=…, DisplayM=…)
at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:564
#17 0x00007ffff2ec9c32 in llvm::DebugIR::runOnModule (this=0x67e0e0, M=…)
at /home/kolkhovskiy/3rdparty/llvm/lib/Transforms/Instrumentation/DebugIR.cpp:590
#18 0x00007fffef4cb5e7 in llvm::MPPassManager::runOnModule (this=0x67cc60, M=…)
at /home/kolkhovskiy/3rdparty/llvm/lib/IR/PassManager.cpp:1608
#19 0x00007fffef4cbbfc in llvm::PassManagerImpl::run (this=0x67c970, M=…)
at /home/kolkhovskiy/3rdparty/llvm/lib/IR/PassManager.cpp:1703
#20 0x00007fffef4cbe0f in llvm::PassManager::run (this=0x67e0c0, M=…)
at /home/kolkhovskiy/3rdparty/llvm/lib/IR/PassManager.cpp:1738
#21 0x00007fffef3d73b8 in LLVMRunPassManager (PM=0x67e0c0, M=0x626360)
at /home/kolkhovskiy/3rdparty/llvm/lib/IR/Core.cpp:2535
<more frames follow, but belong to my own software>

What does “Literal structs never have names” mean? Do i have a problem
somewhere in the IR?

The following patch seems to fix the problem for me. Gdb is able
to see and traverse the IR.

diff --git a/lib/IR/Type.cpp b/lib/IR/Type.cpp
index 46c61fc…ec9b1a0 100644
— a/lib/IR/Type.cpp
+++ b/lib/IR/Type.cpp
@@ -578,7 +578,7 @@ bool StructType::isSized() const {
}

StringRef StructType::getName() const {

  • assert(!isLiteral() && “Literal structs never have names”);
  • if(isLiteral()) return StringRef();
    if (SymbolTableEntry == 0) return StringRef();

return ((StringMapEntry<StructType*> *)SymbolTableEntry)->getKey();

Not sure if this workaround is generic enough for all use cases though.