]> granicus.if.org Git - clang/commitdiff
Debug info: Mark noreturn functions with DIFlagNoReturn.
authorAdrian Prantl <aprantl@apple.com>
Wed, 17 Aug 2016 16:20:32 +0000 (16:20 +0000)
committerAdrian Prantl <aprantl@apple.com>
Wed, 17 Aug 2016 16:20:32 +0000 (16:20 +0000)
This affects functions with the C++11 [[ noreturn ]] and C11 _Noreturn
specifiers.

Patch by Victor Leschuk!

https://reviews.llvm.org/D23168

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@278942 91177308-0d34-0410-b5e6-96231b3b80d8

lib/AST/Decl.cpp
lib/CodeGen/CGDebugInfo.cpp

index 98711822a519e66f0b7085af76e228724f91fae0..cf34c7ab8d4c4c50f1535fa3d56f2e71a599d12c 100644 (file)
@@ -2657,9 +2657,13 @@ bool FunctionDecl::isGlobal() const {
 }
 
 bool FunctionDecl::isNoReturn() const {
-  return hasAttr<NoReturnAttr>() || hasAttr<CXX11NoReturnAttr>() ||
-         hasAttr<C11NoReturnAttr>() ||
-         getType()->getAs<FunctionType>()->getNoReturnAttr();
+  bool HasNoReturnAttr = hasAttr<NoReturnAttr>() || hasAttr<CXX11NoReturnAttr>()
+                         || hasAttr<C11NoReturnAttr>();
+  const auto *FuncType = getType()->getAs<FunctionType>();
+  bool TypeHasNoReturnAttr = false;
+  if (FuncType)
+    TypeHasNoReturnAttr = FuncType->getNoReturnAttr();
+  return HasNoReturnAttr || TypeHasNoReturnAttr;
 }
 
 void
index ee2e21bdd4881229403e27a51301070264ad609c..f56cd0a6bb6c90b07fc64244878063815224d2f0 100644 (file)
@@ -2646,6 +2646,9 @@ void CGDebugInfo::collectFunctionDeclProps(GlobalDecl GD, llvm::DIFile *Unit,
       llvm::DIScope *Mod = getParentModuleOrNull(RDecl);
       FDContext = getContextDescriptor(RDecl, Mod ? Mod : TheCU);
     }
+    // Check if it is a noreturn-marked function
+    if (FD->isNoReturn())
+      Flags |= llvm::DINode::FlagNoReturn;
     // Collect template parameters.
     TParamsArray = CollectFunctionTemplateParams(FD, Unit);
   }