From: Alex Langford Date: Fri, 6 Sep 2019 21:05:21 +0000 (+0000) Subject: [Core] Remove use of ClangASTContext in DumpDataExtractor X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b482db6dfeda8631afae3ca706ad3e3ccfd87d5d;p=platform%2Fupstream%2Fllvm.git [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 --- diff --git a/lldb/include/lldb/Symbol/ClangASTContext.h b/lldb/include/lldb/Symbol/ClangASTContext.h index a64e8f1..5739d32 100644 --- a/lldb/include/lldb/Symbol/ClangASTContext.h +++ b/lldb/include/lldb/Symbol/ClangASTContext.h @@ -694,6 +694,8 @@ public: // Exploring the type + const llvm::fltSemantics &GetFloatTypeSemantics(size_t byte_size) override; + llvm::Optional GetByteSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) { if (llvm::Optional bit_size = GetBitSize(type, exe_scope)) diff --git a/lldb/include/lldb/Symbol/TypeSystem.h b/lldb/include/lldb/Symbol/TypeSystem.h index bff15da..07295c2 100644 --- a/lldb/include/lldb/Symbol/TypeSystem.h +++ b/lldb/include/lldb/Symbol/TypeSystem.h @@ -14,6 +14,7 @@ #include #include +#include "llvm/ADT/APFloat.h" #include "llvm/ADT/APSInt.h" #include "llvm/ADT/SmallBitVector.h" #include "llvm/Support/Casting.h" @@ -276,6 +277,8 @@ public: // Exploring the type + virtual const llvm::fltSemantics &GetFloatTypeSemantics(size_t byte_size) = 0; + virtual llvm::Optional GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) = 0; diff --git a/lldb/source/Core/DumpDataExtractor.cpp b/lldb/source/Core/DumpDataExtractor.cpp index af82393..8ca31e0 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 GetAPInt(const DataExtractor &data, lldb::offset_t *offset_ptr, lldb::offset_t byte_size) { + if (byte_size == 0) + return llvm::None; + llvm::SmallVector 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 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 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 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 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 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 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 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; diff --git a/lldb/source/Symbol/ClangASTContext.cpp b/lldb/source/Symbol/ClangASTContext.cpp index 3df9ccd..f1331cc 100644 --- a/lldb/source/Symbol/ClangASTContext.cpp +++ b/lldb/source/Symbol/ClangASTContext.cpp @@ -4991,6 +4991,22 @@ CompilerType ClangASTContext::GetBasicTypeFromAST(lldb::BasicType basic_type) { } // Exploring the type +const llvm::fltSemantics & +ClangASTContext::GetFloatTypeSemantics(size_t byte_size) { + if (auto *ast = getASTContext()) { + const size_t bit_size = byte_size * 8; + if (bit_size == ast->getTypeSize(ast->FloatTy)) + return ast->getFloatTypeSemantics(ast->FloatTy); + else if (bit_size == ast->getTypeSize(ast->DoubleTy)) + return ast->getFloatTypeSemantics(ast->DoubleTy); + else if (bit_size == ast->getTypeSize(ast->LongDoubleTy)) + return ast->getFloatTypeSemantics(ast->LongDoubleTy); + else if (bit_size == ast->getTypeSize(ast->HalfTy)) + return ast->getFloatTypeSemantics(ast->HalfTy); + } + return llvm::APFloatBase::Bogus(); +} + Optional ClangASTContext::GetBitSize(lldb::opaque_compiler_type_t type, ExecutionContextScope *exe_scope) {