Skip to content

Commit b933408

Browse files
author
git apple-llvm automerger
committed
Merge commit 'f18b55f6a9a8' from swift/release/6.2 into stable/20240723
2 parents 388cdc8 + f18b55f commit b933408

File tree

3 files changed

+91
-126
lines changed

3 files changed

+91
-126
lines changed

lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp

Lines changed: 55 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -2292,6 +2292,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset,
22922292
return true;
22932293
}
22942294

2295+
static bool
2296+
TryParseV2ObjCMetadataSymbol(const char *&symbol_name,
2297+
const char *&symbol_name_non_abi_mangled,
2298+
SymbolType &type) {
2299+
static constexpr llvm::StringLiteral g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2300+
static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass(
2301+
"_OBJC_METACLASS_$_");
2302+
static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
2303+
2304+
llvm::StringRef symbol_name_ref(symbol_name);
2305+
if (symbol_name_ref.empty())
2306+
return false;
2307+
2308+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
2309+
symbol_name_non_abi_mangled = symbol_name + 1;
2310+
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
2311+
type = eSymbolTypeObjCClass;
2312+
return true;
2313+
}
2314+
2315+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) {
2316+
symbol_name_non_abi_mangled = symbol_name + 1;
2317+
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
2318+
type = eSymbolTypeObjCMetaClass;
2319+
return true;
2320+
}
2321+
2322+
if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
2323+
symbol_name_non_abi_mangled = symbol_name + 1;
2324+
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
2325+
type = eSymbolTypeObjCIVar;
2326+
return true;
2327+
}
2328+
2329+
return false;
2330+
}
2331+
22952332
static SymbolType GetSymbolType(const char *&symbol_name,
22962333
bool &demangled_is_synthesized,
22972334
const SectionSP &text_section_sp,
@@ -2408,9 +2445,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
24082445
lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic);
24092446
uint32_t i;
24102447
FileSpecList dylib_files;
2411-
llvm::StringRef g_objc_v2_prefix_class("_OBJC_CLASS_$_");
2412-
llvm::StringRef g_objc_v2_prefix_metaclass("_OBJC_METACLASS_$_");
2413-
llvm::StringRef g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
24142448
UUID image_uuid;
24152449

24162450
for (i = 0; i < m_header.ncmds; ++i) {
@@ -3043,36 +3077,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
30433077
is_gsym = true;
30443078
sym[sym_idx].SetExternal(true);
30453079

3046-
if (symbol_name && symbol_name[0] == '_' &&
3047-
symbol_name[1] == 'O') {
3048-
llvm::StringRef symbol_name_ref(symbol_name);
3049-
if (symbol_name_ref.starts_with(
3050-
g_objc_v2_prefix_class)) {
3051-
symbol_name_non_abi_mangled = symbol_name + 1;
3052-
symbol_name =
3053-
symbol_name + g_objc_v2_prefix_class.size();
3054-
type = eSymbolTypeObjCClass;
3055-
demangled_is_synthesized = true;
3056-
3057-
} else if (symbol_name_ref.starts_with(
3058-
g_objc_v2_prefix_metaclass)) {
3059-
symbol_name_non_abi_mangled = symbol_name + 1;
3060-
symbol_name =
3061-
symbol_name + g_objc_v2_prefix_metaclass.size();
3062-
type = eSymbolTypeObjCMetaClass;
3063-
demangled_is_synthesized = true;
3064-
} else if (symbol_name_ref.starts_with(
3065-
g_objc_v2_prefix_ivar)) {
3066-
symbol_name_non_abi_mangled = symbol_name + 1;
3067-
symbol_name =
3068-
symbol_name + g_objc_v2_prefix_ivar.size();
3069-
type = eSymbolTypeObjCIVar;
3070-
demangled_is_synthesized = true;
3071-
}
3080+
if (TryParseV2ObjCMetadataSymbol(
3081+
symbol_name, symbol_name_non_abi_mangled,
3082+
type)) {
3083+
demangled_is_synthesized = true;
30723084
} else {
30733085
if (nlist.n_value != 0)
30743086
symbol_section = section_info.GetSection(
30753087
nlist.n_sect, nlist.n_value);
3088+
30763089
type = eSymbolTypeData;
30773090
}
30783091
break;
@@ -3558,48 +3571,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
35583571
symbol_sect_name) {
35593572
type = eSymbolTypeRuntime;
35603573

3561-
if (symbol_name) {
3562-
llvm::StringRef symbol_name_ref(symbol_name);
3563-
if (symbol_name_ref.starts_with("_OBJC_")) {
3564-
llvm::StringRef
3565-
g_objc_v2_prefix_class(
3566-
"_OBJC_CLASS_$_");
3567-
llvm::StringRef
3568-
g_objc_v2_prefix_metaclass(
3569-
"_OBJC_METACLASS_$_");
3570-
llvm::StringRef
3571-
g_objc_v2_prefix_ivar("_OBJC_IVAR_$_");
3572-
if (symbol_name_ref.starts_with(
3573-
g_objc_v2_prefix_class)) {
3574-
symbol_name_non_abi_mangled =
3575-
symbol_name + 1;
3576-
symbol_name =
3577-
symbol_name +
3578-
g_objc_v2_prefix_class.size();
3579-
type = eSymbolTypeObjCClass;
3580-
demangled_is_synthesized = true;
3581-
} else if (
3582-
symbol_name_ref.starts_with(
3583-
g_objc_v2_prefix_metaclass)) {
3584-
symbol_name_non_abi_mangled =
3585-
symbol_name + 1;
3586-
symbol_name =
3587-
symbol_name +
3588-
g_objc_v2_prefix_metaclass.size();
3589-
type = eSymbolTypeObjCMetaClass;
3590-
demangled_is_synthesized = true;
3591-
} else if (symbol_name_ref.starts_with(
3592-
g_objc_v2_prefix_ivar)) {
3593-
symbol_name_non_abi_mangled =
3594-
symbol_name + 1;
3595-
symbol_name =
3596-
symbol_name +
3597-
g_objc_v2_prefix_ivar.size();
3598-
type = eSymbolTypeObjCIVar;
3599-
demangled_is_synthesized = true;
3600-
}
3601-
}
3602-
}
3574+
if (TryParseV2ObjCMetadataSymbol(
3575+
symbol_name,
3576+
symbol_name_non_abi_mangled, type))
3577+
demangled_is_synthesized = true;
36033578
} else if (symbol_sect_name &&
36043579
::strstr(symbol_sect_name,
36053580
"__gcc_except_tab") ==
@@ -3956,7 +3931,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39563931

39573932
if (is_debug) {
39583933
switch (nlist.n_type) {
3959-
case N_GSYM:
3934+
case N_GSYM: {
39603935
// global symbol: name,,NO_SECT,type,0
39613936
// Sometimes the N_GSYM value contains the address.
39623937

@@ -3972,33 +3947,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
39723947
is_gsym = true;
39733948
sym[sym_idx].SetExternal(true);
39743949

3975-
if (symbol_name && symbol_name[0] == '_' && symbol_name[1] == 'O') {
3976-
llvm::StringRef symbol_name_ref(symbol_name);
3977-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
3978-
symbol_name_non_abi_mangled = symbol_name + 1;
3979-
symbol_name = symbol_name + g_objc_v2_prefix_class.size();
3980-
type = eSymbolTypeObjCClass;
3981-
demangled_is_synthesized = true;
3982-
3983-
} else if (symbol_name_ref.starts_with(
3984-
g_objc_v2_prefix_metaclass)) {
3985-
symbol_name_non_abi_mangled = symbol_name + 1;
3986-
symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size();
3987-
type = eSymbolTypeObjCMetaClass;
3988-
demangled_is_synthesized = true;
3989-
} else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) {
3990-
symbol_name_non_abi_mangled = symbol_name + 1;
3991-
symbol_name = symbol_name + g_objc_v2_prefix_ivar.size();
3992-
type = eSymbolTypeObjCIVar;
3993-
demangled_is_synthesized = true;
3994-
}
3950+
if (TryParseV2ObjCMetadataSymbol(symbol_name,
3951+
symbol_name_non_abi_mangled, type)) {
3952+
demangled_is_synthesized = true;
39953953
} else {
39963954
if (nlist.n_value != 0)
39973955
symbol_section =
39983956
section_info.GetSection(nlist.n_sect, nlist.n_value);
3957+
39993958
type = eSymbolTypeData;
40003959
}
4001-
break;
3960+
} break;
40023961

40033962
case N_FNAME:
40043963
// procedure name (f77 kludge): name,,NO_SECT,0,0
@@ -4439,38 +4398,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) {
44394398
::strstr(symbol_sect_name, "__objc") == symbol_sect_name) {
44404399
type = eSymbolTypeRuntime;
44414400

4442-
if (symbol_name) {
4443-
llvm::StringRef symbol_name_ref(symbol_name);
4444-
if (symbol_name_ref.starts_with("_OBJC_")) {
4445-
llvm::StringRef g_objc_v2_prefix_class(
4446-
"_OBJC_CLASS_$_");
4447-
llvm::StringRef g_objc_v2_prefix_metaclass(
4448-
"_OBJC_METACLASS_$_");
4449-
llvm::StringRef g_objc_v2_prefix_ivar(
4450-
"_OBJC_IVAR_$_");
4451-
if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) {
4452-
symbol_name_non_abi_mangled = symbol_name + 1;
4453-
symbol_name =
4454-
symbol_name + g_objc_v2_prefix_class.size();
4455-
type = eSymbolTypeObjCClass;
4456-
demangled_is_synthesized = true;
4457-
} else if (symbol_name_ref.starts_with(
4458-
g_objc_v2_prefix_metaclass)) {
4459-
symbol_name_non_abi_mangled = symbol_name + 1;
4460-
symbol_name =
4461-
symbol_name + g_objc_v2_prefix_metaclass.size();
4462-
type = eSymbolTypeObjCMetaClass;
4463-
demangled_is_synthesized = true;
4464-
} else if (symbol_name_ref.starts_with(
4465-
g_objc_v2_prefix_ivar)) {
4466-
symbol_name_non_abi_mangled = symbol_name + 1;
4467-
symbol_name =
4468-
symbol_name + g_objc_v2_prefix_ivar.size();
4469-
type = eSymbolTypeObjCIVar;
4470-
demangled_is_synthesized = true;
4471-
}
4472-
}
4473-
}
4401+
if (TryParseV2ObjCMetadataSymbol(
4402+
symbol_name, symbol_name_non_abi_mangled, type))
4403+
demangled_is_synthesized = true;
44744404
} else if (symbol_sect_name &&
44754405
::strstr(symbol_sect_name, "__gcc_except_tab") ==
44764406
symbol_sect_name) {
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// XFAIL: target-windows
2+
3+
// Tests that LLDB correctly parses global symbols
4+
// starting with 'O'. On some platforms (e.g., Darwin)
5+
// C-symbols are prefixed with a '_'. The LLDB Macho-O
6+
// parses handles Objective-C metadata symbols starting
7+
// with '_OBJC' specially. This test ensures that we don't
8+
// lose track of regular global symbols with a '_O' prefix
9+
// in this.
10+
11+
// RUN: %clang_host -c -g -fno-common %s -o %t.o
12+
// RUN: %clang_host %t.o -o %t.out
13+
// RUN: %lldb -b -x %t.out \
14+
// RUN: -o "b 29" \
15+
// RUN: -o "run" \
16+
// RUN: -o "p OglobalVar" \
17+
// RUN: -o "p Oabc" | FileCheck %s
18+
19+
typedef struct {
20+
int a;
21+
} Oabc_t;
22+
23+
Oabc_t Oabc;
24+
int OglobalVar;
25+
26+
int main(int argc, const char *argv[]) {
27+
Oabc.a = 15;
28+
OglobalVar = 10;
29+
return OglobalVar + Oabc.a;
30+
}
31+
32+
// CHECK: (lldb) p OglobalVar
33+
// CHECK: (int) 10
34+
// CHECK: (lldb) p Oabc
35+
// CHECK: (Oabc_t) (a = 15)

lldb/test/Shell/lit.cfg.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
# suffixes: A list of file extensions to treat as test files. This is overriden
2727
# by individual lit.local.cfg files in the test subdirectories.
28-
config.suffixes = [".test", ".cpp", ".s", ".m"]
28+
config.suffixes = [".test", ".cpp", ".s", ".m", ".ll", ".c"]
2929

3030
# excludes: A list of directories to exclude from the testsuite. The 'Inputs'
3131
# subdirectories contain auxiliary inputs for various tests in their parent

0 commit comments

Comments
 (0)