From f69a113fe54e7d272f9e9f9a43c5cd0eedaf006b Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Thu, 2 Jun 2016 06:21:37 +0000 Subject: [PATCH] [codeview] Return type indices for typedefs Use the type index of the underlying type unless we have a typedef from long to HRESULT; HRESULT typedefs are translated to T_HRESULT. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@271494 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 12 ++++++++++ lib/CodeGen/AsmPrinter/CodeViewDebug.h | 1 + test/DebugInfo/COFF/typedef.ll | 38 ++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 test/DebugInfo/COFF/typedef.ll diff --git a/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index dec6770537e..7c167ba0c43 100644 --- a/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -731,6 +731,8 @@ void CodeViewDebug::beginFunction(const MachineFunction *MF) { TypeIndex CodeViewDebug::lowerType(const DIType *Ty) { // Generic dispatch for lowering an unknown type. switch (Ty->getTag()) { + case dwarf::DW_TAG_typedef: + return lowerTypeAlias(cast(Ty)); case dwarf::DW_TAG_base_type: return lowerTypeBasic(cast(Ty)); case dwarf::DW_TAG_pointer_type: @@ -748,6 +750,16 @@ TypeIndex CodeViewDebug::lowerType(const DIType *Ty) { } } +TypeIndex CodeViewDebug::lowerTypeAlias(const DIDerivedType *Ty) { + // TODO: MSVC emits a S_UDT record. + DITypeRef UnderlyingTypeRef = Ty->getBaseType(); + TypeIndex UnderlyingTypeIndex = getTypeIndex(UnderlyingTypeRef); + if (UnderlyingTypeIndex == TypeIndex(SimpleTypeKind::Int32Long) && + Ty->getName() == "HRESULT") + return TypeIndex(SimpleTypeKind::HResult); + return UnderlyingTypeIndex; +} + TypeIndex CodeViewDebug::lowerTypeBasic(const DIBasicType *Ty) { TypeIndex Index; dwarf::TypeKind Kind; diff --git a/lib/CodeGen/AsmPrinter/CodeViewDebug.h b/lib/CodeGen/AsmPrinter/CodeViewDebug.h index 41350d42f7e..24d785b8d4b 100644 --- a/lib/CodeGen/AsmPrinter/CodeViewDebug.h +++ b/lib/CodeGen/AsmPrinter/CodeViewDebug.h @@ -190,6 +190,7 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDebug : public DebugHandlerBase { codeview::TypeIndex getTypeIndex(DITypeRef Ty); codeview::TypeIndex lowerType(const DIType *Ty); + codeview::TypeIndex lowerTypeAlias(const DIDerivedType *Ty); codeview::TypeIndex lowerTypeBasic(const DIBasicType *Ty); codeview::TypeIndex lowerTypePointer(const DIDerivedType *Ty); codeview::TypeIndex lowerTypeMemberPointer(const DIDerivedType *Ty); diff --git a/test/DebugInfo/COFF/typedef.ll b/test/DebugInfo/COFF/typedef.ll new file mode 100644 index 00000000000..a38080a6bfb --- /dev/null +++ b/test/DebugInfo/COFF/typedef.ll @@ -0,0 +1,38 @@ +; RUN: llc < %s -filetype=obj | llvm-readobj - -codeview | FileCheck %s + +; CHECK: CodeViewDebugInfo [ +; CHECK: Subsection [ +; CHECK: Local { +; CHECK: Type: wchar_t (0x71) +; CHECK: Flags [ (0x0) +; CHECK: ] +; CHECK: VarName: foo +; CHECK: } + +target datalayout = "e-m:x-p:32:32-i64:64-f80:32-n8:16:32-a:0:32-S32" +target triple = "i686-pc-windows-msvc18.0.0" + +define void @test1() !dbg !5 { +entry: + %foo = alloca i16, align 2 + call void @llvm.dbg.declare(metadata i16* %foo, metadata !8, metadata !11), !dbg !12 + ret void, !dbg !12 +} + +declare void @llvm.dbg.declare(metadata, metadata, metadata) + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!3, !4} + +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1) +!1 = !DIFile(filename: "-", directory: "/usr/local/google/home/majnemer/llvm/src") +!3 = !{i32 2, !"CodeView", i32 1} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = distinct !DISubprogram(name: "test1", linkageName: "test1", scope: !6, file: !6, type: !7, unit: !0, variables: !{}) +!6 = !DIFile(filename: "", directory: ".") +!7 = !DISubroutineType(types: !{}) +!8 = !DILocalVariable(name: "foo", scope: !5, file: !6, line: 3, type: !9) +!9 = !DIDerivedType(tag: DW_TAG_typedef, name: "XYZ", file: !6, line: 2, baseType: !10) +!10 = !DIBasicType(name: "wchar_t", size: 16, align: 16, encoding: DW_ATE_unsigned) +!11 = !DIExpression() +!12 = !DILocation(line: 3, column: 16, scope: !5) -- 2.11.0