[cfe-commits] r71591 - in /cfe/trunk: lib/CodeGen/CodeGenModule.cpp test/CodeGenCXX/member-functions.cpp

Chris Lattner sabre at nondot.org
Tue May 12 14:02:28 PDT 2009


Author: lattner
Date: Tue May 12 16:02:27 2009
New Revision: 71591

URL: http://llvm.org/viewvc/llvm-project?rev=71591&view=rev
Log:
add an initial stab at emitting deferred c++ inline functions.  This handles static
functions and methods declared inline, but not ctors/dtors or methods not declared
inline (apparently my previous patch wasn't good enough).


Modified:
    cfe/trunk/lib/CodeGen/CodeGenModule.cpp
    cfe/trunk/test/CodeGenCXX/member-functions.cpp

Modified: cfe/trunk/lib/CodeGen/CodeGenModule.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CodeGenModule.cpp?rev=71591&r1=71590&r2=71591&view=diff

==============================================================================
--- cfe/trunk/lib/CodeGen/CodeGenModule.cpp (original)
+++ cfe/trunk/lib/CodeGen/CodeGenModule.cpp Tue May 12 16:02:27 2009
@@ -606,6 +606,15 @@
     // list, and remove it from DeferredDecls (since we don't need it anymore).
     DeferredDeclsToEmit.push_back(DDI->second);
     DeferredDecls.erase(DDI);
+  } else if (D && D->isThisDeclarationADefinition() && MayDeferGeneration(D)) {
+    // If this the first reference to a C++ inline function in a class, queue up
+    // the deferred function body for emission.  These are not seen as
+    // top-level declarations.
+    // FIXME: Make this work for ctor/dtors.  We need to pass down a full
+    // GlobalDecl instead of just a FunctionDecl.
+    if (!isa<CXXConstructorDecl>(D) &&
+        !isa<CXXDestructorDecl>(D))
+    DeferredDeclsToEmit.push_back(GlobalDecl(D));
   }
   
   // This function doesn't have a complete type (for example, the return

Modified: cfe/trunk/test/CodeGenCXX/member-functions.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/member-functions.cpp?rev=71591&r1=71590&r2=71591&view=diff

==============================================================================
--- cfe/trunk/test/CodeGenCXX/member-functions.cpp (original)
+++ cfe/trunk/test/CodeGenCXX/member-functions.cpp Tue May 12 16:02:27 2009
@@ -8,12 +8,36 @@
 void C::f() {
 }
 
-void f() {
+void test1() {
   C c;
   
 // RUN: grep "call void @_ZN1C1fEv" %t | count 1 &&
   c.f();
   
-// RUN: grep "call void (.struct.C\*, i32, ...)\* @_ZN1C1gEiz" %t | count 1
+// RUN: grep "call void (.struct.C\*, i32, ...)\* @_ZN1C1gEiz" %t | count 1 &&
   c.g(1, 2, 3);
 }
+
+
+struct S {
+  S() { }
+  ~S() { }
+  
+  
+  void f_inline1() { }
+  // RUN: grep "define linkonce_odr void @_ZN1S9f_inline2Ev" %t &&
+  inline void f_inline2() { }
+  
+  // RUN: grep "define internal void @_ZN1S1gEv" %t
+  static void g() { }
+};
+
+void test2() {
+  S s;
+  
+  s.f_inline1();
+  s.f_inline2();
+  
+  S::g();
+  
+}





More information about the cfe-commits mailing list