Index: lldb.xcodeproj/project.pbxproj =================================================================== --- lldb.xcodeproj/project.pbxproj +++ lldb.xcodeproj/project.pbxproj @@ -746,6 +746,7 @@ 6D55BAEE1A8CD0B200A70529 /* PlatformAndroidRemoteGDBServer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6D55BAEB1A8CD08C00A70529 /* PlatformAndroidRemoteGDBServer.cpp */; }; 6D55BAEF1A8CD0B700A70529 /* PlatformAndroid.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D55BAEA1A8CD08C00A70529 /* PlatformAndroid.h */; }; 6D55BAF01A8CD0BD00A70529 /* PlatformAndroidRemoteGDBServer.h in Headers */ = {isa = PBXBuildFile; fileRef = 6D55BAEC1A8CD08C00A70529 /* PlatformAndroidRemoteGDBServer.h */; }; + 6DA349C81AC5BFA700E845E2 /* LanguageOptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6DA349C61AC5BFA700E845E2 /* LanguageOptions.cpp */; }; 8C2D6A53197A1EAF006989C9 /* MemoryHistory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */; }; 8C2D6A5E197A250F006989C9 /* MemoryHistoryASan.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */; }; 8CCB017E19BA28A80009FD44 /* ThreadCollection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 8CCB017A19BA283D0009FD44 /* ThreadCollection.cpp */; }; @@ -2374,6 +2375,8 @@ 6D55BAEA1A8CD08C00A70529 /* PlatformAndroid.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformAndroid.h; sourceTree = ""; }; 6D55BAEB1A8CD08C00A70529 /* PlatformAndroidRemoteGDBServer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = PlatformAndroidRemoteGDBServer.cpp; sourceTree = ""; }; 6D55BAEC1A8CD08C00A70529 /* PlatformAndroidRemoteGDBServer.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = PlatformAndroidRemoteGDBServer.h; sourceTree = ""; }; + 6DA349C61AC5BFA700E845E2 /* LanguageOptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LanguageOptions.cpp; path = source/Utility/LanguageOptions.cpp; sourceTree = ""; }; + 6DA349C71AC5BFA700E845E2 /* LanguageOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LanguageOptions.h; path = source/Utility/LanguageOptions.h; sourceTree = ""; }; 8C2D6A52197A1EAF006989C9 /* MemoryHistory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = MemoryHistory.cpp; path = source/Target/MemoryHistory.cpp; sourceTree = ""; }; 8C2D6A54197A1EBE006989C9 /* MemoryHistory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MemoryHistory.h; path = include/lldb/Target/MemoryHistory.h; sourceTree = ""; }; 8C2D6A5A197A1FDC006989C9 /* MemoryHistoryASan.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MemoryHistoryASan.cpp; sourceTree = ""; }; @@ -3471,6 +3474,8 @@ 2682F168115ED9C800CCFF99 /* Utility */ = { isa = PBXGroup; children = ( + 6DA349C61AC5BFA700E845E2 /* LanguageOptions.cpp */, + 6DA349C71AC5BFA700E845E2 /* LanguageOptions.h */, 257E47151AA56C2000A62F81 /* ModuleCache.cpp */, 257E47161AA56C2000A62F81 /* ModuleCache.h */, 33064C9B1A5C7A490033D415 /* UriParser.h */, @@ -6311,6 +6316,7 @@ 26EFC4CD18CFAF0D00865D87 /* ObjectFileJIT.cpp in Sources */, 49A1CAC51430E8DE00306AC9 /* ExpressionSourceCode.cpp in Sources */, 494260DA14579144003C1C78 /* VerifyDecl.cpp in Sources */, + 6DA349C81AC5BFA700E845E2 /* LanguageOptions.cpp in Sources */, 49DA65031485C92A005FF180 /* AppleObjCDeclVendor.cpp in Sources */, 4966DCC4148978A10028481B /* ClangExternalASTSourceCommon.cpp in Sources */, 26A527C114E24F5F00F3A14A /* ProcessMachCore.cpp in Sources */, Index: source/Expression/ClangExpressionParser.cpp =================================================================== --- source/Expression/ClangExpressionParser.cpp +++ source/Expression/ClangExpressionParser.cpp @@ -70,6 +70,8 @@ #include "llvm/Support/Host.h" #include "llvm/Support/Signals.h" +#include "Utility/LanguageOptions.h" + using namespace clang; using namespace llvm; using namespace lldb_private; @@ -228,6 +230,9 @@ if (expr.DesiredResultType() == ClangExpression::eResultTypeId) m_compiler->getLangOpts().DebuggerCastResultToId = true; + m_compiler->getLangOpts().CharIsSigned = LanguageOptions::CharIsSignedForTriple( + m_compiler->getTargetOpts().Triple.c_str()); + // Spell checking is a nice feature, but it ends up completing a // lot of types that we didn't strictly speaking need to complete. // As a result, we spend a long time parsing and importing debug Index: source/Symbol/ClangASTContext.cpp =================================================================== --- source/Symbol/ClangASTContext.cpp +++ source/Symbol/ClangASTContext.cpp @@ -72,6 +72,8 @@ #include "lldb/Target/Process.h" #include "lldb/Target/ObjCLanguageRuntime.h" +#include "Utility/LanguageOptions.h" + #include #include @@ -109,13 +111,8 @@ return AS_none; } - static void -ParseLangArgs -( - LangOptions &Opts, - InputKind IK -) +ParseLangArgs (LangOptions &Opts, InputKind IK, const char* triple) { // FIXME: Cleanup per-file based stuff. @@ -235,7 +232,7 @@ // Opts.Exceptions = Args.hasArg(OPT_fexceptions); // Opts.RTTI = !Args.hasArg(OPT_fno_rtti); // Opts.Blocks = Args.hasArg(OPT_fblocks); -// Opts.CharIsSigned = !Args.hasArg(OPT_fno_signed_char); + Opts.CharIsSigned = LanguageOptions::CharIsSignedForTriple(triple); // Opts.ShortWChar = Args.hasArg(OPT_fshort_wchar); // Opts.Freestanding = Args.hasArg(OPT_ffreestanding); // Opts.NoBuiltin = Args.hasArg(OPT_fno_builtin) || Opts.Freestanding; @@ -450,7 +447,7 @@ if (m_language_options_ap.get() == nullptr) { m_language_options_ap.reset(new LangOptions()); - ParseLangArgs(*m_language_options_ap, IK_ObjCXX); + ParseLangArgs(*m_language_options_ap, IK_ObjCXX, GetTargetTriple()); // InitializeLangOptions(*m_language_options_ap, IK_ObjCXX); } return m_language_options_ap.get(); @@ -954,16 +951,11 @@ break; case DW_ATE_signed_char: - if (type_name) + if (getLanguageOptions()->CharIsSigned && type_name && streq(type_name, "char")) { - if (streq(type_name, "signed char")) - { - if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) - return ClangASTType (ast, ast->SignedCharTy.getAsOpaquePtr()); - } + if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) + return ClangASTType (ast, ast->CharTy.getAsOpaquePtr()); } - if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) - return ClangASTType (ast, ast->CharTy.getAsOpaquePtr()); if (QualTypeMatchesBitSize (bit_size, ast, ast->SignedCharTy)) return ClangASTType (ast, ast->SignedCharTy.getAsOpaquePtr()); break; @@ -1013,8 +1005,13 @@ if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedInt128Ty)) return ClangASTType (ast, ast->UnsignedInt128Ty.getAsOpaquePtr()); break; - + case DW_ATE_unsigned_char: + if (!getLanguageOptions()->CharIsSigned && type_name && streq(type_name, "char")) + { + if (QualTypeMatchesBitSize (bit_size, ast, ast->CharTy)) + return ClangASTType (ast, ast->CharTy.getAsOpaquePtr()); + } if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedCharTy)) return ClangASTType (ast, ast->UnsignedCharTy.getAsOpaquePtr()); if (QualTypeMatchesBitSize (bit_size, ast, ast->UnsignedShortTy)) Index: source/Utility/CMakeLists.txt =================================================================== --- source/Utility/CMakeLists.txt +++ source/Utility/CMakeLists.txt @@ -6,6 +6,7 @@ ConvertEnum.cpp JSON.cpp KQueue.cpp + LanguageOptions.cpp LLDBAssert.cpp ModuleCache.cpp NameMatches.cpp Index: source/Utility/LanguageOptions.h =================================================================== --- /dev/null +++ source/Utility/LanguageOptions.h @@ -0,0 +1,23 @@ +//===-- LanguageOptions.h ---------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +namespace lldb_private +{ + +class LanguageOptions +{ +public: + static bool + CharIsSignedForTriple(const char* triple_name); + +private: + LanguageOptions() = delete; +}; + +} // namespace lldb_private Index: source/Utility/LanguageOptions.cpp =================================================================== --- /dev/null +++ source/Utility/LanguageOptions.cpp @@ -0,0 +1,43 @@ +//===-- LanguageOptions.cpp -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "LanguageOptions.h" + +#include "llvm/ADT/Triple.h" + +using namespace lldb_private; +using namespace llvm; + +bool +LanguageOptions::CharIsSignedForTriple(const char* triple_name) +{ + Triple triple (triple_name); + + switch (triple.getArch()) { + default: + return true; + + case llvm::Triple::aarch64: + case llvm::Triple::aarch64_be: + case llvm::Triple::arm: + case llvm::Triple::armeb: + case llvm::Triple::thumb: + case llvm::Triple::thumbeb: + return triple.isOSDarwin() || triple.isOSWindows(); + + case llvm::Triple::ppc: + case llvm::Triple::ppc64: + return triple.isOSDarwin(); + + case llvm::Triple::ppc64le: + case llvm::Triple::systemz: + case llvm::Triple::xcore: + return false; + } +}