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
1112LLDB_PLUGIN_DEFINE (TypeSystemD)
1213
@@ -673,7 +674,7 @@ TypeSystemD::CreateBaseType(DTypeKind kind) {
673674}
674675
675676CompilerType
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 }
0 commit comments