[Lldb-commits] [lldb] [lldb] Fix crash in SymbolFileCTF::ParseFunctions (PR #89845)
Jonas Devlieghere via lldb-commits
lldb-commits at lists.llvm.org
Tue Apr 23 16:05:58 PDT 2024
https://github.com/JDevlieghere created https://github.com/llvm/llvm-project/pull/89845
Make SymbolFileCTF::ParseFunctions resilient against not being able to
resolve the argument or return type of a function. ResolveTypeUID can
fail for a variety of reasons so we should always check its result.
The type that caused the crash was `_Bool` which we didn't recognize
as a basic type. This commit also fixes the underlying issue and adds
a test.
rdar://126943722
>From 5a4f813590b0ceb3fb00ed737650e37715019e89 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Tue, 23 Apr 2024 15:26:30 -0700
Subject: [PATCH 1/2] [lldb] Fix crash in SymbolFileCTF::ParseFunctions
Make SymbolFileCTF::ParseFunctions resilient against not being able to
resolve the argument or return type of a function. ResolveTypeUID can
fail for a variety of reasons so we should always check its result.
---
lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
index 65f5b1a5f1b0a2..73c6982d5fbd3c 100644
--- a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
+++ b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
@@ -802,7 +802,8 @@ size_t SymbolFileCTF::ParseFunctions(CompileUnit &cu) {
}
Type *arg_type = ResolveTypeUID(arg_uid);
- arg_types.push_back(arg_type->GetFullCompilerType());
+ arg_types.push_back(arg_type ? arg_type->GetFullCompilerType()
+ : CompilerType());
}
if (symbol) {
@@ -813,8 +814,9 @@ size_t SymbolFileCTF::ParseFunctions(CompileUnit &cu) {
// Create function type.
CompilerType func_type = m_ast->CreateFunctionType(
- ret_type->GetFullCompilerType(), arg_types.data(), arg_types.size(),
- is_variadic, 0, clang::CallingConv::CC_C);
+ ret_type ? ret_type->GetFullCompilerType() : CompilerType(),
+ arg_types.data(), arg_types.size(), is_variadic, 0,
+ clang::CallingConv::CC_C);
lldb::user_id_t function_type_uid = m_types.size() + 1;
TypeSP type_sp =
MakeType(function_type_uid, symbol->GetName(), 0, nullptr,
>From a4bf873cf76d265bed94b26e7534924b7ce5c0bf Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Tue, 23 Apr 2024 16:03:26 -0700
Subject: [PATCH 2/2] [lldb] Support _Bool in Compact C Type Format (CTF)
---
lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp | 2 +-
lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp | 5 ++++-
lldb/test/API/macosx/ctf/Makefile | 2 +-
lldb/test/API/macosx/ctf/TestCTF.py | 1 +
lldb/test/API/macosx/ctf/test.c | 3 +++
5 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
index 73c6982d5fbd3c..386ba44c5ea653 100644
--- a/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
+++ b/lldb/source/Plugins/SymbolFile/CTF/SymbolFileCTF.cpp
@@ -342,7 +342,7 @@ SymbolFileCTF::CreateInteger(const CTFInteger &ctf_integer) {
CompilerType compiler_type = m_ast->GetBasicType(basic_type);
- if (basic_type != eBasicTypeVoid) {
+ if (basic_type != eBasicTypeVoid && basic_type != eBasicTypeBool) {
// Make sure the type we got is an integer type.
bool compiler_type_is_signed = false;
if (!compiler_type.IsIntegerType(compiler_type_is_signed))
diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
index 2621f682011b41..662da313af5989 100644
--- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
+++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp
@@ -838,8 +838,11 @@ lldb::BasicType TypeSystemClang::GetBasicTypeEnumeration(llvm::StringRef name) {
{"__int128_t", eBasicTypeInt128},
{"__uint128_t", eBasicTypeUnsignedInt128},
- // Miscellaneous
+ // "bool"
{"bool", eBasicTypeBool},
+ {"_Bool", eBasicTypeBool},
+
+ // Miscellaneous
{"float", eBasicTypeFloat},
{"double", eBasicTypeDouble},
{"long double", eBasicTypeLongDouble},
diff --git a/lldb/test/API/macosx/ctf/Makefile b/lldb/test/API/macosx/ctf/Makefile
index afe6ab1b5db06b..0857e234837e54 100644
--- a/lldb/test/API/macosx/ctf/Makefile
+++ b/lldb/test/API/macosx/ctf/Makefile
@@ -4,7 +4,7 @@ MAKE_DSYM := YES
ifeq "$(COMPRESS_CTF)" "YES"
COMPRESS := -c
else
- COMPRESS :=
+ COMPRESS :=
endif
all: a.out a.ctf
diff --git a/lldb/test/API/macosx/ctf/TestCTF.py b/lldb/test/API/macosx/ctf/TestCTF.py
index f5fd29f6ed968f..b0a3b4a7eb985c 100644
--- a/lldb/test/API/macosx/ctf/TestCTF.py
+++ b/lldb/test/API/macosx/ctf/TestCTF.py
@@ -53,6 +53,7 @@ def do_test(self):
"[2] = 'b'",
"[3] = 'c'",
'u = (i = 1, s = "")',
+ 'b = false',
"f = 0x0000000000000000",
],
)
diff --git a/lldb/test/API/macosx/ctf/test.c b/lldb/test/API/macosx/ctf/test.c
index 358006646e766e..a15f7a5161334f 100644
--- a/lldb/test/API/macosx/ctf/test.c
+++ b/lldb/test/API/macosx/ctf/test.c
@@ -1,3 +1,4 @@
+#include <stdbool.h>
#include <stdio.h>
struct ForwardDecl;
@@ -24,6 +25,7 @@ typedef struct MyNestedStruct {
char a[4];
MyEnumT e;
MyUnionT u;
+ _Bool b;
} MyNestedStructT;
typedef struct MyStruct {
@@ -54,6 +56,7 @@ void populate(MyInt i) {
foo.n.a[2] = 'c';
foo.n.a[3] = 'd';
foo.n.e = eOne;
+ foo.n.b = false;
foo.f = NULL;
forward = NULL;
bar.b = i;
More information about the lldb-commits
mailing list