Index: lldb/include/lldb/lldb-enumerations.h =================================================================== --- lldb/include/lldb/lldb-enumerations.h +++ lldb/include/lldb/lldb-enumerations.h @@ -162,6 +162,7 @@ eFormatBytes, eFormatBytesWithASCII, eFormatChar, + eFormatWchar, eFormatCharPrintable, // Only printable characters, space if not printable eFormatComplex, // Floating point complex type eFormatComplexFloat = eFormatComplex, Index: lldb/lit/SymbolFile/NativePDB/globals-fundamental.cpp =================================================================== --- lldb/lit/SymbolFile/NativePDB/globals-fundamental.cpp +++ lldb/lit/SymbolFile/NativePDB/globals-fundamental.cpp @@ -637,28 +637,28 @@ char16_t &RC16_24 = C16_24; // CHECK: (lldb) target variable RC16_24 -// FIXME: (char16_t &) RC16_24 = {{.*}} (&::RC16_24 = U+0014) +// CHECK: (char16_t &) RC16_24 = {{.*}} (&::RC16_24 = U+0014) char32_t &RC32_42 = C32_42; // CHECK: (lldb) target variable RC32_42 -// FIXME: (char32_t &) RC32_42 = {{.*}} (&::RC32_42 = U+0x00000022) +// CHECK: (char32_t &) RC32_42 = {{.*}} (&::RC32_42 = U+0x00000022) wchar_t &RWC1 = WC1; // CHECK: (lldb) target variable RWC1 -// FIXME: (wchar_t &) RWC1 = {{.*}} (&::RWC1 = L'1') +// CHECK: (wchar_t &) RWC1 = {{.*}} (&::RWC1 = L'1') wchar_t &RWCP = WCP; // CHECK: (lldb) target variable RWCP -// FIXME: (wchar_t &) RWCP = {{.*}} (&::RWCP = L'P') +// CHECK: (wchar_t &) RWCP = {{.*}} (&::RWCP = L'P') const char16_t &CRC16_24 = C16_24; // CHECK: (lldb) target variable CRC16_24 -// FIXME: (const char16_t &) CRC16_24 = {{.*}} (&::CRC16_24 = U+0014) +// CHECK: (const char16_t &) CRC16_24 = {{.*}} (&::CRC16_24 = U+0014) const char32_t &CRC32_42 = C32_42; // CHECK: (lldb) target variable CRC32_42 -// FIXME: (const char32_t &) CRC32_42 = {{.*}} (&::CRC32_42 = U+0x00000022) +// CHECK: (const char32_t &) CRC32_42 = {{.*}} (&::CRC32_42 = U+0x00000022) const wchar_t &CRWC1 = WC1; // CHECK: (lldb) target variable CRWC1 -// FIXME: (const wchar_t &) CRWC1 = {{.*}} (&::CRWC1 = L'1') +// CHECK: (const wchar_t &) CRWC1 = {{.*}} (&::CRWC1 = L'1') const wchar_t &CRWCP = WCP; // CHECK: (lldb) target variable CRWCP -// FIXME: (const wchar_t &) CRWCP = {{.*}} (&::CRWCP = L'P') +// CHECK: (const wchar_t &) CRWCP = {{.*}} (&::CRWCP = L'P') // CHECK: (lldb) quit Index: lldb/source/Commands/CommandObjectMemory.cpp =================================================================== --- lldb/source/Commands/CommandObjectMemory.cpp +++ lldb/source/Commands/CommandObjectMemory.cpp @@ -167,6 +167,15 @@ format_options.GetCountValue() = 8; break; + case eFormatWchar: + if (!byte_size_option_set) + byte_size_value = + target->GetArchitecture().GetTriple().isOSWindows() ? 2 : 4; + if (!num_per_line_option_set) + m_num_per_line = 1; + if (!count_option_set) + format_options.GetCountValue() = 8; + break; case eFormatBinary: case eFormatFloat: case eFormatOctal: @@ -1412,6 +1421,7 @@ case eFormatBytesWithASCII: case eFormatComplex: case eFormatEnum: + case eFormatWchar: case eFormatUnicode16: case eFormatUnicode32: case eFormatVectorOfChar: Index: lldb/source/Core/DumpDataExtractor.cpp =================================================================== --- lldb/source/Core/DumpDataExtractor.cpp +++ lldb/source/Core/DumpDataExtractor.cpp @@ -637,6 +637,23 @@ } } break; + case eFormatWchar: { + s->PutChar('L'); + s->PutChar(item_count == 1 ? '\'' : '\"'); + + const uint64_t ch = DE.GetMaxU64(&offset, item_byte_size); + // wchar_t semantics vary across platforms, and this is complicated even + // more by the fact that the host may not be the same as the target, so to + // be faithful we would have to follow the target's semantics. For + // simplicity, just print the character if it's ascii. + if (ch <= CHAR_MAX && llvm::isPrint(ch)) + s->PutChar(ch); + else + s->PutChar(NON_PRINTABLE_CHAR); + + s->PutChar(item_count == 1 ? '\'' : '\"'); + } break; + case eFormatUnicode16: s->Printf("U+%4.4x", DE.GetU16(&offset)); break; Index: lldb/source/Core/ValueObject.cpp =================================================================== --- lldb/source/Core/ValueObject.cpp +++ lldb/source/Core/ValueObject.cpp @@ -1383,6 +1383,7 @@ (custom_format == eFormatOSType) || (custom_format == eFormatUnicode16) || (custom_format == eFormatUnicode32) || + (custom_format == eFormatWchar) || (custom_format == eFormatUnsigned) || (custom_format == eFormatPointer) || (custom_format == eFormatComplexInteger) || Index: lldb/source/DataFormatters/FormatManager.cpp =================================================================== --- lldb/source/DataFormatters/FormatManager.cpp +++ lldb/source/DataFormatters/FormatManager.cpp @@ -43,6 +43,7 @@ {eFormatBytesWithASCII, 'Y', "bytes with ASCII"}, {eFormatChar, 'c', "character"}, {eFormatCharPrintable, 'C', "printable character"}, + {eFormatWchar, 'L', "wide character"}, {eFormatComplexFloat, 'F', "complex float"}, {eFormatCString, 's', "c-string"}, {eFormatDecimal, 'd', "decimal"}, Index: lldb/source/DataFormatters/VectorType.cpp =================================================================== --- lldb/source/DataFormatters/VectorType.cpp +++ lldb/source/DataFormatters/VectorType.cpp @@ -64,9 +64,12 @@ case lldb::eFormatHexFloat: return type_system->GetBasicTypeFromAST(lldb::eBasicTypeFloat); + case lldb::eFormatWchar: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeWChar); case lldb::eFormatUnicode16: + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar16); case lldb::eFormatUnicode32: - + return type_system->GetBasicTypeFromAST(lldb::eBasicTypeChar32); case lldb::eFormatUnsigned: return type_system->GetBasicTypeFromAST(lldb::eBasicTypeUnsignedInt); Index: lldb/source/Symbol/ClangASTContext.cpp =================================================================== --- lldb/source/Symbol/ClangASTContext.cpp +++ lldb/source/Symbol/ClangASTContext.cpp @@ -5257,11 +5257,12 @@ return lldb::eFormatBoolean; case clang::BuiltinType::Char_S: case clang::BuiltinType::SChar: - case clang::BuiltinType::WChar_S: case clang::BuiltinType::Char_U: case clang::BuiltinType::UChar: - case clang::BuiltinType::WChar_U: return lldb::eFormatChar; + case clang::BuiltinType::WChar_S: + case clang::BuiltinType::WChar_U: + return lldb::eFormatWchar; case clang::BuiltinType::Char16: return lldb::eFormatUnicode16; case clang::BuiltinType::Char32: