[llvm] r273443 - [codeview] Defer emission of all referenced complete records
David Blaikie via llvm-commits
llvm-commits at lists.llvm.org
Fri Jul 8 14:35:34 PDT 2016
On Wed, Jun 22, 2016 at 10:15 AM, Reid Kleckner via llvm-commits <
llvm-commits at lists.llvm.org> wrote:
> Author: rnk
> Date: Wed Jun 22 12:15:28 2016
> New Revision: 273443
>
> URL: http://llvm.org/viewvc/llvm-project?rev=273443&view=rev
> Log:
> [codeview] Defer emission of all referenced complete records
>
> This is the motivating example:
> struct B { int b; };
> struct A { B *b; };
> int f(A *p) { return p->b->b; }
>
> Clang emits complete types for both A and B because they are required to
> be complete, but our CodeView emission would only emit forward
> declarations of A and B. This was a consequence of the fact that the A*
> type must reference the forward declaration of A, which doesn't
> reference B at all.
>
> We can't eagerly emit complete definitions of A and B when we request
> the forward declaration's type index because of recursive types like
> linked lists. If we did that, our stack usage could get out of hand, and
> it would be possible to lower a type while attempting to lower a type,
> and we would need to double check if our type is already present in the
> TypeIndexMap after all recursive getTypeIndex calls.
>
> Instead, defer complete type emission until after all type lowering has
> completed. This ensures that all referenced complete types are emitted,
> and that type lowering is not re-entrant.
>
Does this make debug info larger by emitting forward declarations for every
type, even when they aren't necessary? (this would certainly happen if we
did this in DWARF emission - so just wondering how it compares). Any idea
how much of a penalty that is for CV size?
>
> Added:
> llvm/trunk/test/DebugInfo/COFF/defer-complete-type.ll
> Modified:
> llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
> llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
> llvm/trunk/test/DebugInfo/COFF/types-basic.ll
> llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp?rev=273443&r1=273442&r2=273443&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp Wed Jun 22
> 12:15:28 2016
> @@ -1400,6 +1400,8 @@ TypeIndex CodeViewDebug::lowerTypeClass(
> TypeIndex FwdDeclTI = TypeTable.writeClass(ClassRecord(
> Kind, 0, CO, HfaKind::None, WindowsRTClassKind::None, TypeIndex(),
> TypeIndex(), TypeIndex(), 0, FullName, Ty->getIdentifier()));
> + if (!Ty->isForwardDecl())
> + DeferredCompleteTypes.push_back(Ty);
> return FwdDeclTI;
> }
>
> @@ -1431,6 +1433,8 @@ TypeIndex CodeViewDebug::lowerTypeUnion(
> TypeIndex FwdDeclTI =
> TypeTable.writeUnion(UnionRecord(0, CO, HfaKind::None, TypeIndex(),
> 0,
> FullName, Ty->getIdentifier()));
> + if (!Ty->isForwardDecl())
> + DeferredCompleteTypes.push_back(Ty);
> return FwdDeclTI;
> }
>
> @@ -1518,6 +1522,18 @@ CodeViewDebug::lowerRecordFieldList(cons
> return std::make_tuple(FieldTI, TypeIndex(), MemberCount);
> }
>
> +struct CodeViewDebug::TypeLoweringScope {
> + TypeLoweringScope(CodeViewDebug &CVD) : CVD(CVD) {
> ++CVD.TypeEmissionLevel; }
> + ~TypeLoweringScope() {
> + // Don't decrement TypeEmissionLevel until after emitting deferred
> types, so
> + // inner TypeLoweringScopes don't attempt to emit deferred types.
> + if (CVD.TypeEmissionLevel == 1)
> + CVD.emitDeferredCompleteTypes();
> + --CVD.TypeEmissionLevel;
> + }
> + CodeViewDebug &CVD;
> +};
> +
> TypeIndex CodeViewDebug::getTypeIndex(DITypeRef TypeRef, DITypeRef
> ClassTyRef) {
> const DIType *Ty = TypeRef.resolve();
> const DIType *ClassTy = ClassTyRef.resolve();
> @@ -1533,9 +1549,14 @@ TypeIndex CodeViewDebug::getTypeIndex(DI
> if (I != TypeIndices.end())
> return I->second;
>
> - TypeIndex TI = lowerType(Ty, ClassTy);
> + TypeIndex TI;
> + {
> + TypeLoweringScope S(*this);
> + TI = lowerType(Ty, ClassTy);
> + recordTypeIndexForDINode(Ty, TI, ClassTy);
> + }
>
> - return recordTypeIndexForDINode(Ty, TI, ClassTy);
> + return TI;
> }
>
> TypeIndex CodeViewDebug::getCompleteTypeIndex(DITypeRef TypeRef) {
> @@ -1564,6 +1585,8 @@ TypeIndex CodeViewDebug::getCompleteType
> if (!InsertResult.second)
> return InsertResult.first->second;
>
> + TypeLoweringScope S(*this);
> +
> // Make sure the forward declaration is emitted first. It's unclear if
> this
> // is necessary, but MSVC does it, and we should follow suit until we
> can show
> // otherwise.
> @@ -1592,6 +1615,19 @@ TypeIndex CodeViewDebug::getCompleteType
> return TI;
> }
>
> +/// Emit all the deferred complete record types. Try to do this in FIFO
> order,
> +/// and do this until fixpoint, as each complete record type typically
> references
> +/// many other record types.
> +void CodeViewDebug::emitDeferredCompleteTypes() {
> + SmallVector<const DICompositeType *, 4> TypesToEmit;
> + while (!DeferredCompleteTypes.empty()) {
> + std::swap(DeferredCompleteTypes, TypesToEmit);
> + for (const DICompositeType *RecordTy : TypesToEmit)
> + getCompleteTypeIndex(RecordTy);
> + TypesToEmit.clear();
> + }
> +}
> +
> void CodeViewDebug::emitLocalVariable(const LocalVariable &Var) {
> // LocalSym record, see SymbolRecord.h for more info.
> MCSymbol *LocalBegin = MMI->getContext().createTempSymbol(),
>
> Modified: llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h?rev=273443&r1=273442&r2=273443&view=diff
>
> ==============================================================================
> --- llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h (original)
> +++ llvm/trunk/lib/CodeGen/AsmPrinter/CodeViewDebug.h Wed Jun 22 12:15:28
> 2016
> @@ -150,6 +150,13 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
> /// always looked up in the normal TypeIndices map.
> DenseMap<const DICompositeType *, codeview::TypeIndex>
> CompleteTypeIndices;
>
> + /// Complete record types to emit after all active type lowerings are
> + /// finished.
> + SmallVector<const DICompositeType *, 4> DeferredCompleteTypes;
> +
> + /// Number of type lowering frames active on the stack.
> + unsigned TypeEmissionLevel = 0;
> +
> const DISubprogram *CurrentSubprogram = nullptr;
>
> // The UDTs we have seen while processing types; each entry is a pair
> of type
> @@ -246,6 +253,10 @@ class LLVM_LIBRARY_VISIBILITY CodeViewDe
> codeview::TypeIndex lowerCompleteTypeClass(const DICompositeType *Ty);
> codeview::TypeIndex lowerCompleteTypeUnion(const DICompositeType *Ty);
>
> + struct TypeLoweringScope;
> +
> + void emitDeferredCompleteTypes();
> +
> void collectMemberInfo(ClassInfo &Info, const DIDerivedType *DDTy);
> ClassInfo collectClassInfo(const DICompositeType *Ty);
>
>
> Added: llvm/trunk/test/DebugInfo/COFF/defer-complete-type.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/defer-complete-type.ll?rev=273443&view=auto
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/defer-complete-type.ll (added)
> +++ llvm/trunk/test/DebugInfo/COFF/defer-complete-type.ll Wed Jun 22
> 12:15:28 2016
> @@ -0,0 +1,193 @@
> +; RUN: llc < %s -filetype=obj | llvm-readobj - -codeview | FileCheck %s
> +
> +; Both A and B should get forward declarations and complete definitions
> for this
> +; example.
> +
> +; C++ source to regenerate:
> +; $ cat t.cpp
> +; struct B { int b; };
> +; struct A { B *b; };
> +; int f(A *p) { return p->b->b; }
> +; $ clang t.cpp -S -emit-llvm -g -gcodeview -o t.ll
> +
> +; CHECK: CodeViewTypes [
> +; CHECK: Section: .debug$T (6)
> +; CHECK: Magic: 0x4
> +; CHECK: Struct (0x1000) {
> +; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
> +; CHECK: MemberCount: 0
> +; CHECK: Properties [ (0x280)
> +; CHECK: ForwardReference (0x80)
> +; CHECK: HasUniqueName (0x200)
> +; CHECK: ]
> +; CHECK: FieldList: 0x0
> +; CHECK: DerivedFrom: 0x0
> +; CHECK: VShape: 0x0
> +; CHECK: SizeOf: 0
> +; CHECK: Name: A
> +; CHECK: LinkageName: .?AUA@@
> +; CHECK: }
> +; CHECK: Pointer (0x1001) {
> +; CHECK: TypeLeafKind: LF_POINTER (0x1002)
> +; CHECK: PointeeType: A (0x1000)
> +; CHECK: PointerAttributes: 0x1000C
> +; CHECK: PtrType: Near64 (0xC)
> +; CHECK: PtrMode: Pointer (0x0)
> +; CHECK: IsFlat: 0
> +; CHECK: IsConst: 0
> +; CHECK: IsVolatile: 0
> +; CHECK: IsUnaligned: 0
> +; CHECK: SizeOf: 8
> +; CHECK: }
> +; CHECK: ArgList (0x1002) {
> +; CHECK: TypeLeafKind: LF_ARGLIST (0x1201)
> +; CHECK: NumArgs: 1
> +; CHECK: Arguments [
> +; CHECK: ArgType: A* (0x1001)
> +; CHECK: ]
> +; CHECK: }
> +; CHECK: Procedure (0x1003) {
> +; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008)
> +; CHECK: ReturnType: int (0x74)
> +; CHECK: CallingConvention: NearC (0x0)
> +; CHECK: FunctionOptions [ (0x0)
> +; CHECK: ]
> +; CHECK: NumParameters: 1
> +; CHECK: ArgListType: (A*) (0x1002)
> +; CHECK: }
> +; CHECK: Struct (0x1004) {
> +; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
> +; CHECK: MemberCount: 0
> +; CHECK: Properties [ (0x280)
> +; CHECK: ForwardReference (0x80)
> +; CHECK: HasUniqueName (0x200)
> +; CHECK: ]
> +; CHECK: FieldList: 0x0
> +; CHECK: DerivedFrom: 0x0
> +; CHECK: VShape: 0x0
> +; CHECK: SizeOf: 0
> +; CHECK: Name: B
> +; CHECK: LinkageName: .?AUB@@
> +; CHECK: }
> +; CHECK: Pointer (0x1005) {
> +; CHECK: TypeLeafKind: LF_POINTER (0x1002)
> +; CHECK: PointeeType: B (0x1004)
> +; CHECK: PointerAttributes: 0x1000C
> +; CHECK: PtrType: Near64 (0xC)
> +; CHECK: PtrMode: Pointer (0x0)
> +; CHECK: IsFlat: 0
> +; CHECK: IsConst: 0
> +; CHECK: IsVolatile: 0
> +; CHECK: IsUnaligned: 0
> +; CHECK: SizeOf: 8
> +; CHECK: }
> +; CHECK: FieldList (0x1006) {
> +; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203)
> +; CHECK: DataMember {
> +; CHECK: AccessSpecifier: Public (0x3)
> +; CHECK: Type: B* (0x1005)
> +; CHECK: FieldOffset: 0x0
> +; CHECK: Name: b
> +; CHECK: }
> +; CHECK: }
> +; CHECK: Struct (0x1007) {
> +; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
> +; CHECK: MemberCount: 1
> +; CHECK: Properties [ (0x200)
> +; CHECK: HasUniqueName (0x200)
> +; CHECK: ]
> +; CHECK: FieldList: <field list> (0x1006)
> +; CHECK: DerivedFrom: 0x0
> +; CHECK: VShape: 0x0
> +; CHECK: SizeOf: 8
> +; CHECK: Name: A
> +; CHECK: LinkageName: .?AUA@@
> +; CHECK: }
> +; CHECK: FieldList (0x1008) {
> +; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203)
> +; CHECK: DataMember {
> +; CHECK: AccessSpecifier: Public (0x3)
> +; CHECK: Type: int (0x74)
> +; CHECK: FieldOffset: 0x0
> +; CHECK: Name: b
> +; CHECK: }
> +; CHECK: }
> +; CHECK: Struct (0x1009) {
> +; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
> +; CHECK: MemberCount: 1
> +; CHECK: Properties [ (0x200)
> +; CHECK: HasUniqueName (0x200)
> +; CHECK: ]
> +; CHECK: FieldList: <field list> (0x1008)
> +; CHECK: DerivedFrom: 0x0
> +; CHECK: VShape: 0x0
> +; CHECK: SizeOf: 4
> +; CHECK: Name: B
> +; CHECK: LinkageName: .?AUB@@
> +; CHECK: }
> +; CHECK: FuncId (0x100A) {
> +; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
> +; CHECK: ParentScope: 0x0
> +; CHECK: FunctionType: int (A*) (0x1003)
> +; CHECK: Name: f
> +; CHECK: }
> +; CHECK: ]
> +
> +; ModuleID = 't.cpp'
> +source_filename = "t.cpp"
> +target datalayout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"
> +target triple = "x86_64-pc-windows-msvc19.0.23918"
> +
> +%struct.A = type { %struct.B* }
> +%struct.B = type { i32 }
> +
> +; Function Attrs: nounwind uwtable
> +define i32 @"\01?f@@YAHPEAUA@@@Z"(%struct.A* %p) #0 !dbg !7 {
> +entry:
> + %p.addr = alloca %struct.A*, align 8
> + store %struct.A* %p, %struct.A** %p.addr, align 8
> + call void @llvm.dbg.declare(metadata %struct.A** %p.addr, metadata !19,
> metadata !20), !dbg !21
> + %0 = load %struct.A*, %struct.A** %p.addr, align 8, !dbg !22
> + %b = getelementptr inbounds %struct.A, %struct.A* %0, i32 0, i32 0,
> !dbg !23
> + %1 = load %struct.B*, %struct.B** %b, align 8, !dbg !23
> + %b1 = getelementptr inbounds %struct.B, %struct.B* %1, i32 0, i32 0,
> !dbg !24
> + %2 = load i32, i32* %b1, align 4, !dbg !24
> + ret i32 %2, !dbg !25
> +}
> +
> +; Function Attrs: nounwind readnone
> +declare void @llvm.dbg.declare(metadata, metadata, metadata) #1
> +
> +attributes #0 = { nounwind uwtable "disable-tail-calls"="false"
> "less-precise-fpmad"="false" "no-frame-pointer-elim"="false"
> "no-infs-fp-math"="false" "no-jump-tables"="false"
> "no-nans-fp-math"="false" "stack-protector-buffer-size"="8"
> "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87"
> "unsafe-fp-math"="false" "use-soft-float"="false" }
> +attributes #1 = { nounwind readnone }
> +
> +!llvm.dbg.cu = !{!0}
> +!llvm.module.flags = !{!3, !4, !5}
> +!llvm.ident = !{!6}
> +
> +!0 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus, file: !1,
> producer: "clang version 3.9.0 ", isOptimized: false, runtimeVersion: 0,
> emissionKind: FullDebug, enums: !2)
> +!1 = !DIFile(filename: "t.cpp", directory: "D:\5Csrc\5Cllvm\5Cbuild")
> +!2 = !{}
> +!3 = !{i32 2, !"CodeView", i32 1}
> +!4 = !{i32 2, !"Debug Info Version", i32 3}
> +!5 = !{i32 1, !"PIC Level", i32 2}
> +!6 = !{!"clang version 3.9.0 "}
> +!7 = distinct !DISubprogram(name: "f", linkageName: "\01?f@@YAHPEAUA@@@Z",
> scope: !1, file: !1, line: 3, type: !8, isLocal: false, isDefinition: true,
> scopeLine: 3, flags: DIFlagPrototyped, isOptimized: false, unit: !0,
> variables: !2)
> +!8 = !DISubroutineType(types: !9)
> +!9 = !{!10, !11}
> +!10 = !DIBasicType(name: "int", size: 32, align: 32, encoding:
> DW_ATE_signed)
> +!11 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !12, size: 64,
> align: 64)
> +!12 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "A",
> file: !1, line: 2, size: 64, align: 64, elements: !13, identifier: ".?AUA@
> @")
> +!13 = !{!14}
> +!14 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !12, file: !1,
> line: 2, baseType: !15, size: 64, align: 64)
> +!15 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !16, size: 64,
> align: 64)
> +!16 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "B",
> file: !1, line: 1, size: 32, align: 32, elements: !17, identifier: ".?AUB@
> @")
> +!17 = !{!18}
> +!18 = !DIDerivedType(tag: DW_TAG_member, name: "b", scope: !16, file: !1,
> line: 1, baseType: !10, size: 32, align: 32)
> +!19 = !DILocalVariable(name: "p", arg: 1, scope: !7, file: !1, line: 3,
> type: !11)
> +!20 = !DIExpression()
> +!21 = !DILocation(line: 3, column: 10, scope: !7)
> +!22 = !DILocation(line: 3, column: 22, scope: !7)
> +!23 = !DILocation(line: 3, column: 25, scope: !7)
> +!24 = !DILocation(line: 3, column: 28, scope: !7)
> +!25 = !DILocation(line: 3, column: 15, scope: !7)
>
> Modified: llvm/trunk/test/DebugInfo/COFF/types-basic.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-basic.ll?rev=273443&r1=273442&r2=273443&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/types-basic.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/types-basic.ll Wed Jun 22 12:15:28 2016
> @@ -119,19 +119,44 @@
> ; CHECK: Arguments [
> ; CHECK: ]
> ; CHECK: }
> -; CHECK: MemberFunction (0x1009) {
> -; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009)
> -; CHECK: ReturnType: void (0x3)
> -; CHECK: ClassType: A (0x1005)
> -; CHECK: ThisType: A* (0x1007)
> -; CHECK: CallingConvention: NearC (0x0)
> -; CHECK: FunctionOptions [ (0x0)
> -; CHECK: ]
> -; CHECK: NumParameters: 0
> -; CHECK: ArgListType: () (0x1008)
> -; CHECK: ThisAdjustment: 0
> -; CHECK: }
> -; CHECK: Pointer (0x100A) {
> +; CHECK: MemberFunction (0x1009) {
> +; CHECK: TypeLeafKind: LF_MFUNCTION (0x1009)
> +; CHECK: ReturnType: void (0x3)
> +; CHECK: ClassType: A (0x1005)
> +; CHECK: ThisType: A* (0x1007)
> +; CHECK: CallingConvention: NearC (0x0)
> +; CHECK: FunctionOptions [ (0x0)
> +; CHECK: ]
> +; CHECK: NumParameters: 0
> +; CHECK: ArgListType: () (0x1008)
> +; CHECK: ThisAdjustment: 0
> +; CHECK: }
> +; CHECK: FieldList (0x100A) {
> +; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203)
> +; CHECK: DataMember {
> +; CHECK: AccessSpecifier: Public (0x3)
> +; CHECK: Type: int (0x74)
> +; CHECK: FieldOffset: 0x0
> +; CHECK: Name: a
> +; CHECK: }
> +; CHECK: OneMethod {
> +; CHECK: AccessSpecifier: Public (0x3)
> +; CHECK: Type: void A::() (0x1009)
> +; CHECK: Name: A::f
> +; CHECK: }
> +; CHECK: }
> +; CHECK: Struct (0x100B) {
> +; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
> +; CHECK: MemberCount: 2
> +; CHECK: Properties [ (0x0)
> +; CHECK: ]
> +; CHECK: FieldList: <field list> (0x100A)
> +; CHECK: DerivedFrom: 0x0
> +; CHECK: VShape: 0x0
> +; CHECK: SizeOf: 4
> +; CHECK: Name: A
> +; CHECK: }
> +; CHECK: Pointer (0x100C) {
> ; CHECK: TypeLeafKind: LF_POINTER (0x1002)
> ; CHECK: PointeeType: void A::() (0x1009)
> ; CHECK: PointerAttributes: 0x1006C
> @@ -144,16 +169,16 @@
> ; CHECK: ClassType: A (0x1005)
> ; CHECK: Representation: GeneralFunction (0x8)
> ; CHECK: }
> -; CHECK: Modifier (0x100B) {
> +; CHECK: Modifier (0x100D) {
> ; CHECK: TypeLeafKind: LF_MODIFIER (0x1001)
> ; CHECK: ModifiedType: void (0x3)
> ; CHECK: Modifiers [ (0x1)
> ; CHECK: Const (0x1)
> ; CHECK: ]
> ; CHECK: }
> -; CHECK: Pointer (0x100C) {
> +; CHECK: Pointer (0x100E) {
> ; CHECK: TypeLeafKind: LF_POINTER (0x1002)
> -; CHECK: PointeeType: const void (0x100B)
> +; CHECK: PointeeType: const void (0x100D)
> ; CHECK: PointerAttributes: 0x1000C
> ; CHECK: PtrType: Near64 (0xC)
> ; CHECK: PtrMode: Pointer (0x0)
> @@ -162,7 +187,7 @@
> ; CHECK: IsVolatile: 0
> ; CHECK: IsUnaligned: 0
> ; CHECK: }
> -; CHECK: Procedure (0x100D) {
> +; CHECK: Procedure (0x100F) {
> ; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008)
> ; CHECK: ReturnType: void (0x3)
> ; CHECK: CallingConvention: NearC (0x0)
> @@ -171,10 +196,10 @@
> ; CHECK: NumParameters: 0
> ; CHECK: ArgListType: () (0x1008)
> ; CHECK: }
> -; CHECK: FuncId (0x100E) {
> +; CHECK: FuncId (0x1010) {
> ; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
> ; CHECK: ParentScope: 0x0
> -; CHECK: FunctionType: void () (0x100D)
> +; CHECK: FunctionType: void () (0x100F)
> ; CHECK: Name: CharTypes
> ; CHECK: }
> ; CHECK: ]
> @@ -235,7 +260,7 @@
> ; CHECK: VarName: v4
> ; CHECK: }
> ; CHECK: Local {
> -; CHECK: Type: void A::() A::* (0x100A)
> +; CHECK: Type: void A::() A::* (0x100C)
> ; CHECK: VarName: v5
> ; CHECK: }
> ; CHECK: Local {
> @@ -255,7 +280,7 @@
> ; CHECK: VarName: l4
> ; CHECK: }
> ; CHECK: Local {
> -; CHECK: Type: const void* (0x100C)
> +; CHECK: Type: const void* (0x100E)
> ; CHECK: VarName: v6
> ; CHECK: }
> ; CHECK: ProcEnd {
> @@ -263,7 +288,7 @@
> ; CHECK: ]
> ; CHECK: Subsection [
> ; CHECK: ProcStart {
> -; CHECK: Type: CharTypes (0x100E)
> +; CHECK: Type: CharTypes (0x1010)
> ; CHECK: DisplayName: CharTypes
> ; CHECK: LinkageName: ?CharTypes@@YAXXZ
> ; CHECK: }
>
> Modified: llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll?rev=273443&r1=273442&r2=273443&view=diff
>
> ==============================================================================
> --- llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll (original)
> +++ llvm/trunk/test/DebugInfo/COFF/types-calling-conv.ll Wed Jun 22
> 12:15:28 2016
> @@ -37,6 +37,7 @@
> ; CHECK: IsConst: 0
> ; CHECK: IsVolatile: 0
> ; CHECK: IsUnaligned: 0
> +; CHECK: SizeOf: 4
> ; CHECK: }
> ; CHECK: ArgList (0x1002) {
> ; CHECK: TypeLeafKind: LF_ARGLIST (0x1201)
> @@ -54,14 +55,34 @@
> ; CHECK: ]
> ; CHECK: NumParameters: 0
> ; CHECK: ArgListType: () (0x1002)
> +; CHECK: ThisAdjustment: 0
> ; CHECK: }
> -; CHECK: FuncId (0x1004) {
> +; CHECK: FieldList (0x1004) {
> +; CHECK: TypeLeafKind: LF_FIELDLIST (0x1203)
> +; CHECK: OneMethod {
> +; CHECK: AccessSpecifier: Public (0x3)
> +; CHECK: Type: void A::() (0x1003)
> +; CHECK: Name: A::thiscallcc
> +; CHECK: }
> +; CHECK: }
> +; CHECK: Struct (0x1005) {
> +; CHECK: TypeLeafKind: LF_STRUCTURE (0x1505)
> +; CHECK: MemberCount: 1
> +; CHECK: Properties [ (0x0)
> +; CHECK: ]
> +; CHECK: FieldList: <field list> (0x1004)
> +; CHECK: DerivedFrom: 0x0
> +; CHECK: VShape: 0x0
> +; CHECK: SizeOf: 1
> +; CHECK: Name: A
> +; CHECK: }
> +; CHECK: MemberFuncId (0x1006) {
> ; CHECK: TypeLeafKind: LF_MFUNC_ID (0x1602)
> ; CHECK: ClassType: A (0x1000)
> ; CHECK: FunctionType: void A::() (0x1003)
> ; CHECK: Name: A::thiscallcc
> ; CHECK: }
> -; CHECK: Procedure (0x1005) {
> +; CHECK: Procedure (0x1007) {
> ; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008)
> ; CHECK: ReturnType: void (0x3)
> ; CHECK: CallingConvention: NearC (0x0)
> @@ -70,13 +91,13 @@
> ; CHECK: NumParameters: 0
> ; CHECK: ArgListType: () (0x1002)
> ; CHECK: }
> -; CHECK: FuncId (0x1006) {
> +; CHECK: FuncId (0x1008) {
> ; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
> ; CHECK: ParentScope: 0x0
> -; CHECK: FunctionType: void () (0x1005)
> +; CHECK: FunctionType: void () (0x1007)
> ; CHECK: Name: cdeclcc
> ; CHECK: }
> -; CHECK: Procedure (0x1007) {
> +; CHECK: Procedure (0x1009) {
> ; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008)
> ; CHECK: ReturnType: void (0x3)
> ; CHECK: CallingConvention: NearFast (0x4)
> @@ -85,13 +106,13 @@
> ; CHECK: NumParameters: 0
> ; CHECK: ArgListType: () (0x1002)
> ; CHECK: }
> -; CHECK: FuncId (0x1008) {
> +; CHECK: FuncId (0x100A) {
> ; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
> ; CHECK: ParentScope: 0x0
> -; CHECK: FunctionType: void () (0x1007)
> +; CHECK: FunctionType: void () (0x1009)
> ; CHECK: Name: fastcallcc
> ; CHECK: }
> -; CHECK: Procedure (0x1009) {
> +; CHECK: Procedure (0x100B) {
> ; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008)
> ; CHECK: ReturnType: void (0x3)
> ; CHECK: CallingConvention: NearStdCall (0x7)
> @@ -100,13 +121,13 @@
> ; CHECK: NumParameters: 0
> ; CHECK: ArgListType: () (0x1002)
> ; CHECK: }
> -; CHECK: FuncId (0x100A) {
> +; CHECK: FuncId (0x100C) {
> ; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
> ; CHECK: ParentScope: 0x0
> -; CHECK: FunctionType: void () (0x1009)
> +; CHECK: FunctionType: void () (0x100B)
> ; CHECK: Name: stdcallcc
> ; CHECK: }
> -; CHECK: Procedure (0x100B) {
> +; CHECK: Procedure (0x100D) {
> ; CHECK: TypeLeafKind: LF_PROCEDURE (0x1008)
> ; CHECK: ReturnType: void (0x3)
> ; CHECK: CallingConvention: NearVector (0x18)
> @@ -115,10 +136,10 @@
> ; CHECK: NumParameters: 0
> ; CHECK: ArgListType: () (0x1002)
> ; CHECK: }
> -; CHECK: FuncId (0x100C) {
> +; CHECK: FuncId (0x100E) {
> ; CHECK: TypeLeafKind: LF_FUNC_ID (0x1601)
> ; CHECK: ParentScope: 0x0
> -; CHECK: FunctionType: void () (0x100B)
> +; CHECK: FunctionType: void () (0x100D)
> ; CHECK: Name: vectorcallcc
> ; CHECK: }
> ; CHECK: ]
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160708/62f54799/attachment.html>
More information about the llvm-commits
mailing list