r197612 - Debug info: Implement (rvalue) reference qualifiers for C++11 non-static

Adrian Prantl aprantl at apple.com
Wed Dec 18 13:48:19 PST 2013


Author: adrian
Date: Wed Dec 18 15:48:18 2013
New Revision: 197612

URL: http://llvm.org/viewvc/llvm-project?rev=197612&view=rev
Log:
Debug info: Implement (rvalue) reference qualifiers for C++11 non-static
member functions. Paired commit with LLVM.

rdar://problem/15356637

Added:
    cfe/trunk/test/CodeGenCXX/debug-info-qualifiers.cpp
Modified:
    cfe/trunk/lib/CodeGen/CGDebugInfo.cpp

Modified: cfe/trunk/lib/CodeGen/CGDebugInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDebugInfo.cpp?rev=197612&r1=197611&r2=197612&view=diff
==============================================================================
--- cfe/trunk/lib/CodeGen/CGDebugInfo.cpp (original)
+++ cfe/trunk/lib/CodeGen/CGDebugInfo.cpp Wed Dec 18 15:48:18 2013
@@ -37,7 +37,7 @@
 #include "llvm/IR/Module.h"
 #include "llvm/Support/Dwarf.h"
 #include "llvm/Support/FileSystem.h"
-#include "llvm/Support/Path.h"
+#include "llvm/Support/Path.h"
 using namespace clang;
 using namespace clang::CodeGen;
 
@@ -1005,7 +1005,13 @@ llvm::DICompositeType CGDebugInfo::getOr
 
   llvm::DIArray EltTypeArray = DBuilder.getOrCreateArray(Elts);
 
-  return DBuilder.createSubroutineType(Unit, EltTypeArray);
+  unsigned Flags = 0;
+  if (Func->getExtProtoInfo().RefQualifier == RQ_LValue)
+    Flags |= llvm::DIDescriptor::FlagLValueReference;
+  if (Func->getExtProtoInfo().RefQualifier == RQ_RValue)
+    Flags |= llvm::DIDescriptor::FlagRValueReference;
+
+  return DBuilder.createSubroutineType(Unit, EltTypeArray, Flags);
 }
 
 /// isFunctionLocalClass - Return true if CXXRecordDecl is defined
@@ -1084,6 +1090,10 @@ CGDebugInfo::CreateCXXMemberFunction(con
   }
   if (Method->hasPrototype())
     Flags |= llvm::DIDescriptor::FlagPrototyped;
+  if (Method->getRefQualifier() == RQ_LValue)
+    Flags |= llvm::DIDescriptor::FlagLValueReference;
+  if (Method->getRefQualifier() == RQ_RValue)
+    Flags |= llvm::DIDescriptor::FlagRValueReference;
 
   llvm::DIArray TParamsArray = CollectFunctionTemplateParams(Method, Unit);
   llvm::DISubprogram SP =

Added: cfe/trunk/test/CodeGenCXX/debug-info-qualifiers.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/debug-info-qualifiers.cpp?rev=197612&view=auto
==============================================================================
--- cfe/trunk/test/CodeGenCXX/debug-info-qualifiers.cpp (added)
+++ cfe/trunk/test/CodeGenCXX/debug-info-qualifiers.cpp Wed Dec 18 15:48:18 2013
@@ -0,0 +1,23 @@
+// RUN: %clang_cc1 -std=c++11 -emit-llvm -g -triple x86_64-apple-darwin %s -o - | FileCheck %s
+// Test (r)value qualifiers on C++11 non-static member functions.
+class A {
+public:
+  // CHECK: [ DW_TAG_subprogram ] [line [[@LINE+1]]] [reference] [l]
+  void l() const &;
+  // CHECK: [ DW_TAG_subprogram ] [line [[@LINE+1]]] [rvalue reference] [r]
+  void r() const &&;
+};
+
+void g() {
+  A a;
+  // The type of pl is "void (A::*)() const &".
+  // CHECK: metadata ![[PL:[0-9]+]], i32 0, i32 0} ; [ DW_TAG_auto_variable ] [pl] [line [[@LINE+3]]]
+  // CHECK: metadata ![[PLSR:[0-9]+]], metadata !"{{.*}}"} ; [ DW_TAG_ptr_to_member_type ]
+  // CHECK: ![[PLSR]] ={{.*}}[ DW_TAG_subroutine_type ]{{.*}}[reference]
+  auto pl = &A::l;
+
+  // CHECK: metadata ![[PR:[0-9]+]], i32 0, i32 0} ; [ DW_TAG_auto_variable ] [pr] [line [[@LINE+3]]]
+  // CHECK: metadata ![[PRSR:[0-9]+]], metadata !"{{.*}}"} ; [ DW_TAG_ptr_to_member_type ]
+  // CHECK: ![[PRSR]] ={{.*}}[ DW_TAG_subroutine_type ]{{.*}}[rvalue reference]
+  auto pr = &A::r;
+}





More information about the cfe-commits mailing list