Skip to content

Commit 7d4b672

Browse files
committed
[lldb] Add support for the rest of the builtin types
1 parent 7631f74 commit 7d4b672

File tree

3 files changed

+108
-2
lines changed

3 files changed

+108
-2
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserD.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ DWARFASTParserD::ParseSimpleType(const lldb_private::SymbolContext &sc,
102102
{
103103
case DW_TAG_base_type:
104104
cp_type = m_ast.GetBuiltinTypeForDWARFEncodingAndBitSize(
105+
attrs.name.GetStringRef(),
105106
attrs.encoding, attrs.byte_size.getValueOr(0) * 8);
106107
break;
107108
default: break;

lldb/source/Plugins/TypeSystem/D/TypeSystemD.cpp

Lines changed: 106 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "lldb/Core/StreamFile.h"
88
#include "lldb/Symbol/Type.h"
99
#include "lldb/Utility/ArchSpec.h"
10+
#include "llvm/ADT/StringSwitch.h"
1011

1112
LLDB_PLUGIN_DEFINE(TypeSystemD)
1213

@@ -673,7 +674,7 @@ TypeSystemD::CreateBaseType(DTypeKind kind) {
673674
}
674675

675676
CompilerType
676-
TypeSystemD::GetBuiltinTypeForDWARFEncodingAndBitSize(uint32_t dw_ate, uint32_t bit_size)
677+
TypeSystemD::GetBuiltinTypeForDWARFEncodingAndBitSize(llvm::StringRef type_name, uint32_t dw_ate, uint32_t bit_size)
677678
{
678679
auto IsMatch = [&](DTypeKind kind) {
679680
llvm::Optional<uint64_t> BS = DType::GetBitSize(kind, m_target_triple);
@@ -685,10 +686,114 @@ TypeSystemD::GetBuiltinTypeForDWARFEncodingAndBitSize(uint32_t dw_ate, uint32_t
685686

686687
switch(dw_ate)
687688
{
689+
case DW_ATE_address:
690+
if (IsMatch(eDTypeKindPtr))
691+
return CreateBaseType(eDTypeKindPtr);
692+
break;
693+
688694
case DW_ATE_boolean:
689695
if (IsMatch(eDTypeKindBool))
690696
return CreateBaseType(eDTypeKindBool);
691697
break;
698+
699+
case DW_ATE_complex_float:
700+
if (IsMatch(eDTypeKindCFloat))
701+
return CreateBaseType(eDTypeKindCFloat);
702+
// check for creal and complex long double type name to be backward
703+
// compatible with old DMD backend.
704+
if (!type_name.empty() && (type_name == "creal" || type_name == "complex long double"))
705+
{
706+
if (IsMatch(eDTypeKindCReal80))
707+
return CreateBaseType(eDTypeKindCReal80);
708+
if (IsMatch(eDTypeKindCReal128))
709+
return CreateBaseType(eDTypeKindCReal128);
710+
if (IsMatch(eDTypeKindCReal64))
711+
return CreateBaseType(eDTypeKindCReal64);
712+
// fallback to ABI-specific bit size
713+
if (IsMatch(eDTypeKindCReal))
714+
return CreateBaseType(eDTypeKindCReal);
715+
}
716+
717+
if (IsMatch(eDTypeKindCDouble))
718+
return CreateBaseType(eDTypeKindCDouble);
719+
break;
720+
721+
case DW_ATE_float:
722+
if (IsMatch(eDTypeKindFloat))
723+
return CreateBaseType(eDTypeKindFloat);
724+
// check for real and long double type name to be backward compatible
725+
// with old DMD backend.
726+
if (!type_name.empty() && (type_name == "real" || type_name == "long double"))
727+
{
728+
if (IsMatch(eDTypeKindReal80))
729+
return CreateBaseType(eDTypeKindReal80);
730+
if (IsMatch(eDTypeKindReal128))
731+
return CreateBaseType(eDTypeKindReal128);
732+
if (IsMatch(eDTypeKindReal64))
733+
return CreateBaseType(eDTypeKindReal64);
734+
// fallback to ABI-specific bit size
735+
if (IsMatch(eDTypeKindReal))
736+
return CreateBaseType(eDTypeKindReal);
737+
}
738+
739+
if (IsMatch(eDTypeKindDouble))
740+
return CreateBaseType(eDTypeKindDouble);
741+
break;
742+
743+
case DW_ATE_signed:
744+
if (IsMatch(eDTypeKindByte))
745+
return CreateBaseType(eDTypeKindByte);
746+
if (IsMatch(eDTypeKindShort))
747+
return CreateBaseType(eDTypeKindShort);
748+
if (IsMatch(eDTypeKindInt))
749+
return CreateBaseType(eDTypeKindInt);
750+
if (IsMatch(eDTypeKindLong))
751+
return CreateBaseType(eDTypeKindLong);
752+
if (IsMatch(eDTypeKindCent))
753+
return CreateBaseType(eDTypeKindCent);
754+
break;
755+
case DW_ATE_signed_char:
756+
if (IsMatch(eDTypeKindByte))
757+
return CreateBaseType(eDTypeKindByte);
758+
break;
759+
case DW_ATE_unsigned:
760+
if (IsMatch(eDTypeKindUByte))
761+
return CreateBaseType(eDTypeKindUByte);
762+
if (IsMatch(eDTypeKindUShort))
763+
return CreateBaseType(eDTypeKindUShort);
764+
if (IsMatch(eDTypeKindUInt))
765+
return CreateBaseType(eDTypeKindUInt);
766+
if (IsMatch(eDTypeKindULong))
767+
return CreateBaseType(eDTypeKindULong);
768+
if (IsMatch(eDTypeKindUCent))
769+
return CreateBaseType(eDTypeKindUCent);
770+
break;
771+
case DW_ATE_unsigned_char:
772+
if (IsMatch(eDTypeKindUByte))
773+
return CreateBaseType(eDTypeKindUByte);
774+
break;
775+
case DW_ATE_UTF:
776+
switch(bit_size) {
777+
case 8: // UTF-8
778+
return CreateBaseType(eDTypeKindChar);
779+
case 16: // UTF-16
780+
return CreateBaseType(eDTypeKindWChar);
781+
case 32: // UTF-32
782+
return CreateBaseType(eDTypeKindDChar);
783+
}
784+
if (!type_name.empty())
785+
{
786+
// use a string switch with backward compatible type names
787+
DTypeKind kind = llvm::StringSwitch<DTypeKind>(type_name)
788+
.Cases("char8_t", "char", eDTypeKindChar)
789+
.Cases("char16_t", "wchar_t", "wchar", eDTypeKindWChar)
790+
.Cases("char32_t", "dchar", eDTypeKindDChar)
791+
.Default(eDTypeKindInvalid);
792+
793+
if (kind != eDTypeKindInvalid)
794+
return CreateBaseType(kind);
795+
}
796+
break;
692797
default:
693798
break;
694799
}

lldb/source/Plugins/TypeSystem/D/TypeSystemD.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,7 @@ class TypeSystemD : public TypeSystem {
344344
const lldb_private::ConstString &name);
345345
CompilerType CreateBaseType(DTypeKind kind);
346346

347-
CompilerType GetBuiltinTypeForDWARFEncodingAndBitSize(uint32_t dw_ate, uint32_t bit_size);
347+
CompilerType GetBuiltinTypeForDWARFEncodingAndBitSize(llvm::StringRef type_name, uint32_t dw_ate, uint32_t bit_size);
348348

349349
std::unique_ptr<DWARFASTParserD> m_dwarf_ast_parser_up;
350350
llvm::Triple m_target_triple;

0 commit comments

Comments
 (0)