|
7 | 7 | //===----------------------------------------------------------------------===// |
8 | 8 |
|
9 | 9 | #include "lldb/ValueObject/DILEval.h" |
10 | | -#include "lldb/Core/Module.h" |
11 | 10 | #include "lldb/Symbol/CompileUnit.h" |
12 | | -#include "lldb/Symbol/TypeSystem.h" |
13 | 11 | #include "lldb/Symbol/VariableList.h" |
14 | 12 | #include "lldb/Target/RegisterContext.h" |
15 | 13 | #include "lldb/ValueObject/DILAST.h" |
@@ -499,107 +497,4 @@ Interpreter::Visit(const BitFieldExtractionNode *node) { |
499 | 497 | return child_valobj_sp; |
500 | 498 | } |
501 | 499 |
|
502 | | -static llvm::Expected<lldb::TypeSystemSP> |
503 | | -GetTypeSystemFromCU(std::shared_ptr<StackFrame> ctx) { |
504 | | - SymbolContext symbol_context = |
505 | | - ctx->GetSymbolContext(lldb::eSymbolContextCompUnit); |
506 | | - lldb::LanguageType language = symbol_context.comp_unit->GetLanguage(); |
507 | | - |
508 | | - symbol_context = ctx->GetSymbolContext(lldb::eSymbolContextModule); |
509 | | - return symbol_context.module_sp->GetTypeSystemForLanguage(language); |
510 | | -} |
511 | | - |
512 | | -static CompilerType GetBasicType(lldb::TypeSystemSP type_system, |
513 | | - lldb::BasicType basic_type) { |
514 | | - if (type_system) |
515 | | - return type_system.get()->GetBasicTypeFromAST(basic_type); |
516 | | - |
517 | | - return CompilerType(); |
518 | | -} |
519 | | - |
520 | | -llvm::Expected<CompilerType> |
521 | | -Interpreter::PickIntegerType(lldb::TypeSystemSP type_system, |
522 | | - std::shared_ptr<ExecutionContextScope> ctx, |
523 | | - const IntegerLiteralNode *literal) { |
524 | | - // Binary, Octal, Hexadecimal and literals with a U suffix are allowed to be |
525 | | - // an unsigned integer. |
526 | | - bool unsigned_is_allowed = literal->IsUnsigned() || literal->GetRadix() != 10; |
527 | | - llvm::APInt apint = literal->GetValue(); |
528 | | - |
529 | | - llvm::SmallVector<std::pair<lldb::BasicType, lldb::BasicType>, 3> candidates; |
530 | | - if (literal->GetTypeSuffix() <= IntegerTypeSuffix::None) |
531 | | - candidates.emplace_back(lldb::eBasicTypeInt, |
532 | | - unsigned_is_allowed ? lldb::eBasicTypeUnsignedInt |
533 | | - : lldb::eBasicTypeInvalid); |
534 | | - if (literal->GetTypeSuffix() <= IntegerTypeSuffix::Long) |
535 | | - candidates.emplace_back(lldb::eBasicTypeLong, |
536 | | - unsigned_is_allowed ? lldb::eBasicTypeUnsignedLong |
537 | | - : lldb::eBasicTypeInvalid); |
538 | | - candidates.emplace_back(lldb::eBasicTypeLongLong, |
539 | | - lldb::eBasicTypeUnsignedLongLong); |
540 | | - for (auto [signed_, unsigned_] : candidates) { |
541 | | - CompilerType signed_type = type_system->GetBasicTypeFromAST(signed_); |
542 | | - if (!signed_type) |
543 | | - continue; |
544 | | - llvm::Expected<uint64_t> size = signed_type.GetBitSize(ctx.get()); |
545 | | - if (!size) |
546 | | - return size.takeError(); |
547 | | - if (!literal->IsUnsigned() && apint.isIntN(*size - 1)) |
548 | | - return signed_type; |
549 | | - if (unsigned_ != lldb::eBasicTypeInvalid && apint.isIntN(*size)) |
550 | | - return type_system->GetBasicTypeFromAST(unsigned_); |
551 | | - } |
552 | | - |
553 | | - return llvm::make_error<DILDiagnosticError>( |
554 | | - m_expr, |
555 | | - "integer literal is too large to be represented in any integer type", |
556 | | - literal->GetLocation()); |
557 | | -} |
558 | | - |
559 | | -llvm::Expected<lldb::ValueObjectSP> |
560 | | -Interpreter::Visit(const IntegerLiteralNode *node) { |
561 | | - llvm::Expected<lldb::TypeSystemSP> type_system = |
562 | | - GetTypeSystemFromCU(m_exe_ctx_scope); |
563 | | - if (!type_system) |
564 | | - return type_system.takeError(); |
565 | | - |
566 | | - llvm::Expected<CompilerType> type = |
567 | | - PickIntegerType(*type_system, m_exe_ctx_scope, node); |
568 | | - if (!type) |
569 | | - return type.takeError(); |
570 | | - |
571 | | - Scalar scalar = node->GetValue(); |
572 | | - // APInt from StringRef::getAsInteger comes with just enough bitwidth to |
573 | | - // hold the value. This adjusts APInt bitwidth to match the compiler type. |
574 | | - llvm::Expected<uint64_t> type_bitsize = |
575 | | - type->GetBitSize(m_exe_ctx_scope.get()); |
576 | | - if (!type_bitsize) |
577 | | - return type_bitsize.takeError(); |
578 | | - scalar.TruncOrExtendTo(*type_bitsize, false); |
579 | | - return ValueObject::CreateValueObjectFromScalar(m_target, scalar, *type, |
580 | | - "result"); |
581 | | -} |
582 | | - |
583 | | -llvm::Expected<lldb::ValueObjectSP> |
584 | | -Interpreter::Visit(const FloatLiteralNode *node) { |
585 | | - llvm::Expected<lldb::TypeSystemSP> type_system = |
586 | | - GetTypeSystemFromCU(m_exe_ctx_scope); |
587 | | - if (!type_system) |
588 | | - return type_system.takeError(); |
589 | | - |
590 | | - bool isFloat = |
591 | | - &node->GetValue().getSemantics() == &llvm::APFloat::IEEEsingle(); |
592 | | - lldb::BasicType basic_type = |
593 | | - isFloat ? lldb::eBasicTypeFloat : lldb::eBasicTypeDouble; |
594 | | - CompilerType type = GetBasicType(*type_system, basic_type); |
595 | | - |
596 | | - if (!type) |
597 | | - return llvm::make_error<DILDiagnosticError>( |
598 | | - m_expr, "unable to create a const literal", node->GetLocation()); |
599 | | - |
600 | | - Scalar scalar = node->GetValue(); |
601 | | - return ValueObject::CreateValueObjectFromScalar(m_target, scalar, type, |
602 | | - "result"); |
603 | | -} |
604 | | - |
605 | 500 | } // namespace lldb_private::dil |
0 commit comments