r272198 - [DebugInfo] Add calling conventions to DISubroutineType

David Blaikie via cfe-commits cfe-commits at lists.llvm.org
Wed Jun 8 14:52:59 PDT 2016


At least in theory it'd be nice to have test cases for the other call sites
this change adds CC to.

On Wed, Jun 8, 2016 at 1:41 PM, Reid Kleckner via cfe-commits <
cfe-commits at lists.llvm.org> wrote:

> Author: rnk
> Date: Wed Jun  8 15:41:54 2016
> New Revision: 272198
>
> URL: http://llvm.org/viewvc/llvm-project?rev=272198&view=rev
> Log:
> [DebugInfo] Add calling conventions to DISubroutineType
>
> Summary:
> This should have been a very simple change, but it was greatly
> complicated by the construction of new Decls during IR generation.
>
> In particular, we reconstruct the AST function type in order to get the
> implicit 'this' parameter into C++ method types.
>
> We also have to worry about FunctionDecls whose types are not
> FunctionTypes because CGBlocks.cpp constructs some dummy FunctionDecls
> with 'void' type.
>
> Depends on D21114
>
> Reviewers: aprantl, dblaikie
>
> Subscribers: cfe-commits
>
> Differential Revision: http://reviews.llvm.org/D21141
>
> Added:
>     cfe/trunk/test/CodeGenCXX/debug-info-calling-conventions.cpp
> Modified:
>     cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
>     cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
>
> Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=272198&r1=272197&r2=272198&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Jun  8 15:41:54 2016
> @@ -831,6 +831,39 @@ llvm::DIType *CGDebugInfo::CreateType(co
>        getDeclContextDescriptor(Ty->getDecl()));
>  }
>
> +static unsigned getDwarfCC(CallingConv CC) {
> +  switch (CC) {
> +  case CC_C:
> +    // Avoid emitting DW_AT_calling_convention if the C convention was
> used.
> +    return 0;
> +
> +  case CC_X86StdCall:
> +    return llvm::dwarf::DW_CC_BORLAND_stdcall;
> +  case CC_X86FastCall:
> +    return llvm::dwarf::DW_CC_BORLAND_msfastcall;
> +  case CC_X86ThisCall:
> +    return llvm::dwarf::DW_CC_BORLAND_thiscall;
> +  case CC_X86VectorCall:
> +    return llvm::dwarf::DW_CC_LLVM_vectorcall;
> +  case CC_X86Pascal:
> +    return llvm::dwarf::DW_CC_BORLAND_pascal;
> +
> +  // FIXME: Create new DW_CC_ codes for these calling conventions.
> +  case CC_X86_64Win64:
> +  case CC_X86_64SysV:
> +  case CC_AAPCS:
> +  case CC_AAPCS_VFP:
> +  case CC_IntelOclBicc:
> +  case CC_SpirFunction:
> +  case CC_SpirKernel:
> +  case CC_Swift:
> +  case CC_PreserveMost:
> +  case CC_PreserveAll:
> +    return 0;
> +  }
> +  return 0;
> +}
> +
>  llvm::DIType *CGDebugInfo::CreateType(const FunctionType *Ty,
>                                        llvm::DIFile *Unit) {
>    SmallVector<llvm::Metadata *, 16> EltTys;
> @@ -850,7 +883,8 @@ llvm::DIType *CGDebugInfo::CreateType(co
>    }
>
>    llvm::DITypeRefArray EltTypeArray =
> DBuilder.getOrCreateTypeArray(EltTys);
> -  return DBuilder.createSubroutineType(EltTypeArray);
> +  return DBuilder.createSubroutineType(EltTypeArray, 0,
> +                                       getDwarfCC(Ty->getCallConv()));
>  }
>
>  /// Convert an AccessSpecifier into the corresponding DINode flag.
> @@ -1103,7 +1137,8 @@ llvm::DISubroutineType *CGDebugInfo::get
>    if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
>      Flags |= llvm::DINode::FlagRValueReference;
>
> -  return DBuilder.createSubroutineType(EltTypeArray, Flags);
> +  return DBuilder.createSubroutineType(EltTypeArray, Flags,
> +                                       getDwarfCC(Func->getCallConv()));
>  }
>
>  /// isFunctionLocalClass - Return true if CXXRecordDecl is defined
> @@ -2562,9 +2597,9 @@ CGDebugInfo::getFunctionForwardDeclarati
>    SmallVector<QualType, 16> ArgTypes;
>    for (const ParmVarDecl *Parm: FD->parameters())
>      ArgTypes.push_back(Parm->getType());
> -  QualType FnType =
> -    CGM.getContext().getFunctionType(FD->getReturnType(), ArgTypes,
> -                                     FunctionProtoType::ExtProtoInfo());
> +  CallingConv CC = FD->getType()->castAs<FunctionType>()->getCallConv();
> +  QualType FnType = CGM.getContext().getFunctionType(
> +      FD->getReturnType(), ArgTypes, FunctionProtoType::ExtProtoInfo(CC));
>    llvm::DISubprogram *SP = DBuilder.createTempFunctionFwdDecl(
>        DContext, Name, LinkageName, Unit, Line,
>        getOrCreateFunctionType(FD, FnType, Unit),
> !FD->isExternallyVisible(),
> @@ -2668,6 +2703,10 @@ llvm::DISubroutineType *CGDebugInfo::get
>
>    if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D))
>      return getOrCreateMethodType(Method, F);
> +
> +  const auto *FTy = FnType->getAs<FunctionType>();
> +  CallingConv CC = FTy ? FTy->getCallConv() : CallingConv::CC_C;
> +
>    if (const ObjCMethodDecl *OMethod = dyn_cast<ObjCMethodDecl>(D)) {
>      // Add "self" and "_cmd"
>      SmallVector<llvm::Metadata *, 16> Elts;
> @@ -2701,7 +2740,7 @@ llvm::DISubroutineType *CGDebugInfo::get
>        Elts.push_back(DBuilder.createUnspecifiedParameter());
>
>      llvm::DITypeRefArray EltTypeArray =
> DBuilder.getOrCreateTypeArray(Elts);
> -    return DBuilder.createSubroutineType(EltTypeArray);
> +    return DBuilder.createSubroutineType(EltTypeArray, 0, getDwarfCC(CC));
>    }
>
>    // Handle variadic function types; they need an additional
> @@ -2715,7 +2754,7 @@ llvm::DISubroutineType *CGDebugInfo::get
>            EltTys.push_back(getOrCreateType(FPT->getParamType(i), F));
>        EltTys.push_back(DBuilder.createUnspecifiedParameter());
>        llvm::DITypeRefArray EltTypeArray =
> DBuilder.getOrCreateTypeArray(EltTys);
> -      return DBuilder.createSubroutineType(EltTypeArray);
> +      return DBuilder.createSubroutineType(EltTypeArray, 0,
> getDwarfCC(CC));
>      }
>
>    return cast<llvm::DISubroutineType>(getOrCreateType(FnType, F));
>
> Modified: cfe/trunk/lib/CodeGen/CodeGenFunction.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenFunction.cpp?rev=272198&r1=272197&r2=272198&view=diff
>
> ==============================================================================
> --- cfe/trunk/lib/CodeGen/CodeGenFunction.cpp (original)
> +++ cfe/trunk/lib/CodeGen/CodeGenFunction.cpp Wed Jun  8 15:41:54 2016
> @@ -762,15 +762,18 @@ void CodeGenFunction::StartFunction(Glob
>
>    // Emit subprogram debug descriptor.
>    if (CGDebugInfo *DI = getDebugInfo()) {
> +    // Reconstruct the type from the argument list so that implicit
> parameters,
> +    // such as 'this' and 'vtt', show up in the debug info. Preserve the
> calling
> +    // convention.
> +    CallingConv CC = CallingConv::CC_C;
> +    if (auto *FD = dyn_cast_or_null<FunctionDecl>(D))
> +      if (const auto *SrcFnTy = FD->getType()->getAs<FunctionType>())
> +        CC = SrcFnTy->getCallConv();
>      SmallVector<QualType, 16> ArgTypes;
> -    for (FunctionArgList::const_iterator i = Args.begin(), e = Args.end();
> -        i != e; ++i) {
> -      ArgTypes.push_back((*i)->getType());
> -    }
> -
> -    QualType FnType =
> -      getContext().getFunctionType(RetTy, ArgTypes,
> -                                   FunctionProtoType::ExtProtoInfo());
> +    for (const VarDecl *VD : Args)
> +      ArgTypes.push_back(VD->getType());
> +    QualType FnType = getContext().getFunctionType(
> +        RetTy, ArgTypes, FunctionProtoType::ExtProtoInfo(CC));
>      DI->EmitFunctionStart(GD, Loc, StartLoc, FnType, CurFn, Builder);
>    }
>
>
> Added: cfe/trunk/test/CodeGenCXX/debug-info-calling-conventions.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-calling-conventions.cpp?rev=272198&view=auto
>
> ==============================================================================
> --- cfe/trunk/test/CodeGenCXX/debug-info-calling-conventions.cpp (added)
> +++ cfe/trunk/test/CodeGenCXX/debug-info-calling-conventions.cpp Wed Jun
> 8 15:41:54 2016
> @@ -0,0 +1,26 @@
> +// RUN: %clang_cc1 %s -triple=i686-pc-windows-msvc
> -debug-info-kind=limited -emit-llvm -o - | FileCheck %s
> +
> +struct A {
> +  void thiscallcc();
> +};
> +void A::thiscallcc() {}
> +
> +// CHECK: !DISubprogram(name: "thiscallcc", {{.*}} type:
> ![[thiscallty:[^,]*]], {{.*}})
> +// CHECK: ![[thiscallty]] = !DISubroutineType(cc: DW_CC_BORLAND_thiscall,
> types: ![[thisargs:[^,)]*]])
> +// CHECK: ![[thisargs]] = !{null, ![[thisptrty:[^,}]*]]}
> +// CHECK: ![[thisptrty]] = !DIDerivedType(tag: DW_TAG_pointer_type,
> baseType: !{{.*}}, size: 32, align: 32, flags: DIFlagArtificial |
> DIFlagObjectPointer)
> +
> +void cdeclcc() {}
> +void __fastcall fastcallcc() {}
> +void __stdcall stdcallcc() {}
> +void __vectorcall vectorcallcc() {}
> +
> +// CHECK: !DISubprogram(name: "cdeclcc", {{.*}} type: ![[cdeclty:[^,]*]],
> {{.*}})
> +// CHECK: ![[cdeclty]] = !DISubroutineType(types: ![[noargs:[^,)]*]])
> +// CHECK: ![[noargs]] = !{null}
> +// CHECK: !DISubprogram(name: "fastcallcc", {{.*}} type:
> ![[fastcallty:[^,]*]], {{.*}})
> +// CHECK: ![[fastcallty]] = !DISubroutineType(cc:
> DW_CC_BORLAND_msfastcall, types: ![[noargs]])
> +// CHECK: !DISubprogram(name: "stdcallcc", {{.*}} type:
> ![[stdcallty:[^,]*]], {{.*}})
> +// CHECK: ![[stdcallty]] = !DISubroutineType(cc: DW_CC_BORLAND_stdcall,
> types: ![[noargs]])
> +// CHECK: !DISubprogram(name: "vectorcallcc", {{.*}} type:
> ![[vectorcallty:[^,]*]], {{.*}})
> +// CHECK: ![[vectorcallty]] = !DISubroutineType(cc:
> DW_CC_LLVM_vectorcall, types: ![[noargs]])
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20160608/2b293717/attachment-0001.html>


More information about the cfe-commits mailing list