diff options
author | Alex Langford <apl@fb.com> | 2019-09-06 21:05:21 +0000 |
---|---|---|
committer | Alex Langford <apl@fb.com> | 2019-09-06 21:05:21 +0000 |
commit | b482db6dfeda8631afae3ca706ad3e3ccfd87d5d (patch) | |
tree | c61994d2cf99062eaae97dc6c4b65b89f7ad3635 /lldb/source/Core/DumpDataExtractor.cpp | |
parent | 6cee434ed10ead6b7416ca5ee9592b2b207eeb0f (diff) | |
download | bcm5719-llvm-b482db6dfeda8631afae3ca706ad3e3ccfd87d5d.tar.gz bcm5719-llvm-b482db6dfeda8631afae3ca706ad3e3ccfd87d5d.zip |
[Core] Remove use of ClangASTContext in DumpDataExtractor
Summary:
DumpDataExtractor uses ClangASTContext in order to get the proper llvm
fltSemantics for the type it needs so that it can dump floats in a more
precise way. However, there's no reason that this behavior needs to be
specific ClangASTContext. Instead, I think it makes sense to ask
TypeSystems for the float semantics for a type of a given size.
Differential Revision: https://reviews.llvm.org/D67239
llvm-svn: 371258
Diffstat (limited to 'lldb/source/Core/DumpDataExtractor.cpp')
-rw-r--r-- | lldb/source/Core/DumpDataExtractor.cpp | 80 |
1 files changed, 28 insertions, 52 deletions
diff --git a/lldb/source/Core/DumpDataExtractor.cpp b/lldb/source/Core/DumpDataExtractor.cpp index af8239332b1..8ca31e0f200 100644 --- a/lldb/source/Core/DumpDataExtractor.cpp +++ b/lldb/source/Core/DumpDataExtractor.cpp @@ -14,7 +14,6 @@ #include "lldb/Core/Address.h" #include "lldb/Core/Disassembler.h" #include "lldb/Core/ModuleList.h" -#include "lldb/Symbol/ClangASTContext.h" #include "lldb/Target/ExecutionContext.h" #include "lldb/Target/ExecutionContextScope.h" #include "lldb/Target/SectionLoadList.h" @@ -69,6 +68,9 @@ static float half2float(uint16_t half) { static llvm::Optional<llvm::APInt> GetAPInt(const DataExtractor &data, lldb::offset_t *offset_ptr, lldb::offset_t byte_size) { + if (byte_size == 0) + return llvm::None; + llvm::SmallVector<uint64_t, 2> uint64_array; lldb::offset_t bytes_left = byte_size; uint64_t u64; @@ -556,57 +558,31 @@ lldb::offset_t lldb_private::DumpDataExtractor( if (exe_scope) target_sp = exe_scope->CalculateTarget(); if (target_sp) { - ClangASTContext *clang_ast = target_sp->GetScratchClangASTContext(); - if (clang_ast) { - clang::ASTContext *ast = clang_ast->getASTContext(); - if (ast) { - llvm::SmallVector<char, 256> sv; - // Show full precision when printing float values - const unsigned format_precision = 0; - const unsigned format_max_padding = - target_sp->GetMaxZeroPaddingInFloatFormat(); - size_t item_bit_size = item_byte_size * 8; - - if (item_bit_size == ast->getTypeSize(ast->FloatTy)) { - llvm::Optional<llvm::APInt> apint = - GetAPInt(DE, &offset, item_byte_size); - if (apint.hasValue()) { - llvm::APFloat apfloat(ast->getFloatTypeSemantics(ast->FloatTy), - apint.getValue()); - apfloat.toString(sv, format_precision, format_max_padding); - } - } else if (item_bit_size == ast->getTypeSize(ast->DoubleTy)) { - llvm::Optional<llvm::APInt> apint = - GetAPInt(DE, &offset, item_byte_size); - if (apint.hasValue()) { - llvm::APFloat apfloat(ast->getFloatTypeSemantics(ast->DoubleTy), - apint.getValue()); - apfloat.toString(sv, format_precision, format_max_padding); - } - } else if (item_bit_size == ast->getTypeSize(ast->LongDoubleTy)) { - const auto &semantics = - ast->getFloatTypeSemantics(ast->LongDoubleTy); - - offset_t byte_size = item_byte_size; - if (&semantics == &llvm::APFloatBase::x87DoubleExtended()) - byte_size = (llvm::APFloat::getSizeInBits(semantics) + 7) / 8; - - llvm::Optional<llvm::APInt> apint = - GetAPInt(DE, &offset, byte_size); - if (apint.hasValue()) { - llvm::APFloat apfloat(semantics, apint.getValue()); - apfloat.toString(sv, format_precision, format_max_padding); - } - } else if (item_bit_size == ast->getTypeSize(ast->HalfTy)) { - llvm::Optional<llvm::APInt> apint = - GetAPInt(DE, &offset, item_byte_size); - if (apint.hasValue()) { - llvm::APFloat apfloat(ast->getFloatTypeSemantics(ast->HalfTy), - apint.getValue()); - apfloat.toString(sv, format_precision, format_max_padding); - } - } - + auto type_system_or_err = + target_sp->GetScratchTypeSystemForLanguage(eLanguageTypeC); + if (!type_system_or_err) { + llvm::consumeError(type_system_or_err.takeError()); + } else { + auto &type_system = *type_system_or_err; + llvm::SmallVector<char, 256> sv; + // Show full precision when printing float values + const unsigned format_precision = 0; + const unsigned format_max_padding = + target_sp->GetMaxZeroPaddingInFloatFormat(); + + const auto &semantics = + type_system.GetFloatTypeSemantics(item_byte_size); + + // Recalculate the byte size in case of a difference. This is possible + // when item_byte_size is 16 (128-bit), because you could get back the + // x87DoubleExtended semantics which has a byte size of 10 (80-bit). + const size_t semantics_byte_size = + (llvm::APFloat::getSizeInBits(semantics) + 7) / 8; + llvm::Optional<llvm::APInt> apint = + GetAPInt(DE, &offset, semantics_byte_size); + if (apint.hasValue()) { + llvm::APFloat apfloat(semantics, apint.getValue()); + apfloat.toString(sv, format_precision, format_max_padding); if (!sv.empty()) { s->Printf("%*.*s", (int)sv.size(), (int)sv.size(), sv.data()); used_upfloat = true; |