Skip to content

Commit 40e5edd

Browse files
[lldb][gnustep][PDB] Add special handling for ObjC built-in types eBasicTypeObjCID and eBasicTypeObjCSel
1 parent 59315c5 commit 40e5edd

File tree

3 files changed

+53
-3
lines changed

3 files changed

+53
-3
lines changed

lldb/source/Plugins/SymbolFile/PDB/PDBASTParser.cpp

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -756,12 +756,32 @@ lldb::TypeSP PDBASTParser::CreateLLDBTypeFromPDBType(const PDBSymbol &type) {
756756
auto *pointer_type = llvm::dyn_cast<PDBSymbolTypePointer>(&type);
757757
assert(pointer_type);
758758

759-
SymbolFile *symbol_file = m_ast.GetSymbolFile();
759+
auto *symbol_file = static_cast<SymbolFilePDB *>(m_ast.GetSymbolFile());
760760
if (!symbol_file)
761761
return nullptr;
762762

763-
Type *pointee_type = symbol_file->ResolveTypeUID(
764-
pointer_type->getPointeeType()->getSymIndexId());
763+
auto pdb_pointee_type = pointer_type->getPointeeType()->getSymIndexId();
764+
if (symbol_file->IsObjCBuiltinTypeId(pdb_pointee_type)) {
765+
// Clang emits id as objc_object* and we fill in the built-in "id" type
766+
CompilerType id_type = m_ast.GetBasicType(eBasicTypeObjCID);
767+
AddSourceInfoToDecl(type, decl);
768+
return symbol_file->MakeType(
769+
pointer_type->getSymIndexId(), ConstString("id"),
770+
pointer_type->getLength(), nullptr, pdb_pointee_type,
771+
lldb_private::Type::eEncodingIsUID, decl, id_type,
772+
lldb_private::Type::ResolveState::Full);
773+
}
774+
if (symbol_file->IsObjCBuiltinTypeSel(pdb_pointee_type)) {
775+
CompilerType id_type = m_ast.GetBasicType(eBasicTypeObjCSel);
776+
AddSourceInfoToDecl(type, decl);
777+
return symbol_file->MakeType(
778+
pointer_type->getSymIndexId(), ConstString("SEL"),
779+
pointer_type->getLength(), nullptr, pdb_pointee_type,
780+
lldb_private::Type::eEncodingIsUID, decl, id_type,
781+
lldb_private::Type::ResolveState::Full);
782+
}
783+
784+
Type *pointee_type = symbol_file->ResolveTypeUID(pdb_pointee_type);
765785
if (!pointee_type)
766786
return nullptr;
767787

lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,3 +2088,31 @@ bool SymbolFilePDB::IsaNSObjectOrNSProxy(
20882088
auto *pdb_base_udt = llvm::dyn_cast<PDBSymbolTypeUDT>(pdb_base_raw_up.get());
20892089
return IsaNSObjectOrNSProxy(*pdb_base_udt);
20902090
}
2091+
2092+
bool SymbolFilePDB::IsObjCBuiltinTypeId(user_id_t sym_uid) const {
2093+
std::unique_ptr<PDBSymbol> pdb_sym_up = m_session_up->getSymbolById(sym_uid);
2094+
if (pdb_sym_up->getSymTag() != PDB_SymType::UDT)
2095+
return false;
2096+
2097+
auto *pdb_sym_udt = llvm::dyn_cast<PDBSymbolTypeUDT>(pdb_sym_up.get());
2098+
if (pdb_sym_udt->getName() != "id" &&
2099+
pdb_sym_udt->getName() != "objc_object")
2100+
return false;
2101+
2102+
return true;
2103+
}
2104+
2105+
bool SymbolFilePDB::IsObjCBuiltinTypeSel(user_id_t sym_uid) const {
2106+
std::unique_ptr<PDBSymbol> pdb_sym_up = m_session_up->getSymbolById(sym_uid);
2107+
if (pdb_sym_up->getSymTag() != PDB_SymType::UDT)
2108+
return false;
2109+
2110+
auto *pdb_sym_udt = llvm::dyn_cast<PDBSymbolTypeUDT>(pdb_sym_up.get());
2111+
if (pdb_sym_udt->getName() != "objc_selector")
2112+
return false;
2113+
2114+
// TODO: ObjC selectors exist only for ObjC functions and they never occur
2115+
// freestanding. Thus, we know that all instances of this UDT are defined
2116+
// within ObjCInterfaceDecls. Can we add a check for that?
2117+
return true;
2118+
}

lldb/source/Plugins/SymbolFile/PDB/SymbolFilePDB.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,8 @@ class SymbolFilePDB : public lldb_private::SymbolFileCommon {
170170
void DumpClangAST(lldb_private::Stream &s) override;
171171

172172
bool IsaNSObjectOrNSProxy(const llvm::pdb::PDBSymbolTypeUDT &udt) const;
173+
bool IsObjCBuiltinTypeId(lldb::user_id_t sym_uid) const;
174+
bool IsObjCBuiltinTypeSel(lldb::user_id_t sym_uid) const;
173175

174176
private:
175177
struct SecContribInfo {

0 commit comments

Comments
 (0)