diff options
Diffstat (limited to 'lldb/source/Plugins')
4 files changed, 68 insertions, 130 deletions
diff --git a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp index 924953c..3c49c91 100644 --- a/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp +++ b/lldb/source/Plugins/ExpressionParser/Clang/ClangExpressionParser.cpp @@ -792,7 +792,7 @@ ClangExpressionParser::ClangExpressionParser( // 6. Set up the source management objects inside the compiler m_compiler->createFileManager(); if (!m_compiler->hasSourceManager()) - m_compiler->createSourceManager(m_compiler->getFileManager()); + m_compiler->createSourceManager(); m_compiler->createPreprocessor(TU_Complete); switch (expr.Language().AsLanguageType()) { diff --git a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp index 4e8a430..a2199cb 100644 --- a/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp +++ b/lldb/source/Plugins/Language/CPlusPlus/CPlusPlusLanguage.cpp @@ -104,10 +104,10 @@ CPlusPlusLanguage::GetFunctionNameInfo(ConstString name) const { } bool CPlusPlusLanguage::SymbolNameFitsToLanguage(Mangled mangled) const { - const char *mangled_name = mangled.GetMangledName().GetCString(); - auto mangling_scheme = Mangled::GetManglingScheme(mangled_name); - return mangled_name && (mangling_scheme == Mangled::eManglingSchemeItanium || - mangling_scheme == Mangled::eManglingSchemeMSVC); + auto mangling_scheme = + Mangled::GetManglingScheme(mangled.GetMangledName().GetStringRef()); + return mangling_scheme == Mangled::eManglingSchemeItanium || + mangling_scheme == Mangled::eManglingSchemeMSVC; } ConstString CPlusPlusLanguage::GetDemangledFunctionNameWithoutArguments( diff --git a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp index fada1fd..9cdb846 100644 --- a/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp +++ b/lldb/source/Plugins/ObjectFile/Mach-O/ObjectFileMachO.cpp @@ -2067,6 +2067,43 @@ static bool ParseTrieEntries(DataExtractor &data, lldb::offset_t offset, return true; } +static bool +TryParseV2ObjCMetadataSymbol(const char *&symbol_name, + const char *&symbol_name_non_abi_mangled, + SymbolType &type) { + static constexpr llvm::StringLiteral g_objc_v2_prefix_class("_OBJC_CLASS_$_"); + static constexpr llvm::StringLiteral g_objc_v2_prefix_metaclass( + "_OBJC_METACLASS_$_"); + static constexpr llvm::StringLiteral g_objc_v2_prefix_ivar("_OBJC_IVAR_$_"); + + llvm::StringRef symbol_name_ref(symbol_name); + if (symbol_name_ref.empty()) + return false; + + if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = symbol_name + g_objc_v2_prefix_class.size(); + type = eSymbolTypeObjCClass; + return true; + } + + if (symbol_name_ref.starts_with(g_objc_v2_prefix_metaclass)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size(); + type = eSymbolTypeObjCMetaClass; + return true; + } + + if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) { + symbol_name_non_abi_mangled = symbol_name + 1; + symbol_name = symbol_name + g_objc_v2_prefix_ivar.size(); + type = eSymbolTypeObjCIVar; + return true; + } + + return false; +} + static SymbolType GetSymbolType(const char *&symbol_name, bool &demangled_is_synthesized, const SectionSP &text_section_sp, @@ -2183,9 +2220,6 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { lldb::offset_t offset = MachHeaderSizeFromMagic(m_header.magic); uint32_t i; FileSpecList dylib_files; - llvm::StringRef g_objc_v2_prefix_class("_OBJC_CLASS_$_"); - llvm::StringRef g_objc_v2_prefix_metaclass("_OBJC_METACLASS_$_"); - llvm::StringRef g_objc_v2_prefix_ivar("_OBJC_IVAR_$_"); UUID image_uuid; for (i = 0; i < m_header.ncmds; ++i) { @@ -2805,36 +2839,15 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { is_gsym = true; sym[sym_idx].SetExternal(true); - if (symbol_name && symbol_name[0] == '_' && - symbol_name[1] == 'O') { - llvm::StringRef symbol_name_ref(symbol_name); - if (symbol_name_ref.starts_with( - g_objc_v2_prefix_class)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = - symbol_name + g_objc_v2_prefix_class.size(); - type = eSymbolTypeObjCClass; - demangled_is_synthesized = true; - - } else if (symbol_name_ref.starts_with( - g_objc_v2_prefix_metaclass)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = - symbol_name + g_objc_v2_prefix_metaclass.size(); - type = eSymbolTypeObjCMetaClass; - demangled_is_synthesized = true; - } else if (symbol_name_ref.starts_with( - g_objc_v2_prefix_ivar)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = - symbol_name + g_objc_v2_prefix_ivar.size(); - type = eSymbolTypeObjCIVar; - demangled_is_synthesized = true; - } + if (TryParseV2ObjCMetadataSymbol( + symbol_name, symbol_name_non_abi_mangled, + type)) { + demangled_is_synthesized = true; } else { if (nlist.n_value != 0) symbol_section = section_info.GetSection( nlist.n_sect, nlist.n_value); + type = eSymbolTypeData; } break; @@ -3320,48 +3333,10 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { symbol_sect_name) { type = eSymbolTypeRuntime; - if (symbol_name) { - llvm::StringRef symbol_name_ref(symbol_name); - if (symbol_name_ref.starts_with("_OBJC_")) { - llvm::StringRef - g_objc_v2_prefix_class( - "_OBJC_CLASS_$_"); - llvm::StringRef - g_objc_v2_prefix_metaclass( - "_OBJC_METACLASS_$_"); - llvm::StringRef - g_objc_v2_prefix_ivar("_OBJC_IVAR_$_"); - if (symbol_name_ref.starts_with( - g_objc_v2_prefix_class)) { - symbol_name_non_abi_mangled = - symbol_name + 1; - symbol_name = - symbol_name + - g_objc_v2_prefix_class.size(); - type = eSymbolTypeObjCClass; - demangled_is_synthesized = true; - } else if ( - symbol_name_ref.starts_with( - g_objc_v2_prefix_metaclass)) { - symbol_name_non_abi_mangled = - symbol_name + 1; - symbol_name = - symbol_name + - g_objc_v2_prefix_metaclass.size(); - type = eSymbolTypeObjCMetaClass; - demangled_is_synthesized = true; - } else if (symbol_name_ref.starts_with( - g_objc_v2_prefix_ivar)) { - symbol_name_non_abi_mangled = - symbol_name + 1; - symbol_name = - symbol_name + - g_objc_v2_prefix_ivar.size(); - type = eSymbolTypeObjCIVar; - demangled_is_synthesized = true; - } - } - } + if (TryParseV2ObjCMetadataSymbol( + symbol_name, + symbol_name_non_abi_mangled, type)) + demangled_is_synthesized = true; } else if (symbol_sect_name && ::strstr(symbol_sect_name, "__gcc_except_tab") == @@ -3652,7 +3627,7 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { if (is_debug) { switch (nlist.n_type) { - case N_GSYM: + case N_GSYM: { // global symbol: name,,NO_SECT,type,0 // Sometimes the N_GSYM value contains the address. @@ -3668,33 +3643,17 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { is_gsym = true; sym[sym_idx].SetExternal(true); - if (symbol_name && symbol_name[0] == '_' && symbol_name[1] == 'O') { - llvm::StringRef symbol_name_ref(symbol_name); - if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = symbol_name + g_objc_v2_prefix_class.size(); - type = eSymbolTypeObjCClass; - demangled_is_synthesized = true; - - } else if (symbol_name_ref.starts_with( - g_objc_v2_prefix_metaclass)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = symbol_name + g_objc_v2_prefix_metaclass.size(); - type = eSymbolTypeObjCMetaClass; - demangled_is_synthesized = true; - } else if (symbol_name_ref.starts_with(g_objc_v2_prefix_ivar)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = symbol_name + g_objc_v2_prefix_ivar.size(); - type = eSymbolTypeObjCIVar; - demangled_is_synthesized = true; - } + if (TryParseV2ObjCMetadataSymbol(symbol_name, + symbol_name_non_abi_mangled, type)) { + demangled_is_synthesized = true; } else { if (nlist.n_value != 0) symbol_section = section_info.GetSection(nlist.n_sect, nlist.n_value); + type = eSymbolTypeData; } - break; + } break; case N_FNAME: // procedure name (f77 kludge): name,,NO_SECT,0,0 @@ -4130,38 +4089,9 @@ void ObjectFileMachO::ParseSymtab(Symtab &symtab) { ::strstr(symbol_sect_name, "__objc") == symbol_sect_name) { type = eSymbolTypeRuntime; - if (symbol_name) { - llvm::StringRef symbol_name_ref(symbol_name); - if (symbol_name_ref.starts_with("_OBJC_")) { - llvm::StringRef g_objc_v2_prefix_class( - "_OBJC_CLASS_$_"); - llvm::StringRef g_objc_v2_prefix_metaclass( - "_OBJC_METACLASS_$_"); - llvm::StringRef g_objc_v2_prefix_ivar( - "_OBJC_IVAR_$_"); - if (symbol_name_ref.starts_with(g_objc_v2_prefix_class)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = - symbol_name + g_objc_v2_prefix_class.size(); - type = eSymbolTypeObjCClass; - demangled_is_synthesized = true; - } else if (symbol_name_ref.starts_with( - g_objc_v2_prefix_metaclass)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = - symbol_name + g_objc_v2_prefix_metaclass.size(); - type = eSymbolTypeObjCMetaClass; - demangled_is_synthesized = true; - } else if (symbol_name_ref.starts_with( - g_objc_v2_prefix_ivar)) { - symbol_name_non_abi_mangled = symbol_name + 1; - symbol_name = - symbol_name + g_objc_v2_prefix_ivar.size(); - type = eSymbolTypeObjCIVar; - demangled_is_synthesized = true; - } - } - } + if (TryParseV2ObjCMetadataSymbol( + symbol_name, symbol_name_non_abi_mangled, type)) + demangled_is_synthesized = true; } else if (symbol_sect_name && ::strstr(symbol_sect_name, "__gcc_except_tab") == symbol_sect_name) { diff --git a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp index a5aaf1f..21c265e 100644 --- a/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp +++ b/lldb/source/Plugins/TypeSystem/Clang/TypeSystemClang.cpp @@ -960,6 +960,12 @@ CompilerType TypeSystemClang::GetBuiltinTypeForDWARFEncodingAndBitSize( if (type_name == "long double" && QualTypeMatchesBitSize(bit_size, ast, ast.LongDoubleTy)) return GetType(ast.LongDoubleTy); + if (type_name == "__bf16" && + QualTypeMatchesBitSize(bit_size, ast, ast.BFloat16Ty)) + return GetType(ast.BFloat16Ty); + if (type_name == "_Float16" && + QualTypeMatchesBitSize(bit_size, ast, ast.Float16Ty)) + return GetType(ast.Float16Ty); // As Rust currently uses `TypeSystemClang`, match `f128` here as well so it // doesn't get misinterpreted as `long double` on targets where they are // the same size but different formats. @@ -1792,6 +1798,8 @@ bool TypeSystemClang::RecordHasFields(const RecordDecl *record_decl) { for (base_class = cxx_record_decl->bases_begin(), base_class_end = cxx_record_decl->bases_end(); base_class != base_class_end; ++base_class) { + assert(record_decl != base_class->getType()->getAsCXXRecordDecl() && + "Base can't inherit from itself."); if (RecordHasFields(base_class->getType()->getAsCXXRecordDecl())) return true; } |