[dragonegg] r182705 - Add support for __builtin_init_heap_trampoline, fixing PR16015. While there,

Duncan Sands baldrick at free.fr
Fri May 24 20:25:43 PDT 2013


Author: baldrick
Date: Fri May 24 22:25:43 2013
New Revision: 182705

URL: http://llvm.org/viewvc/llvm-project?rev=182705&view=rev
Log:
Add support for __builtin_init_heap_trampoline, fixing PR16015.  While there,
implement -Wtrampolines.

Added:
    dragonegg/trunk/test/validator/c/trampoline-warning.c
    dragonegg/trunk/test/validator/go/
    dragonegg/trunk/test/validator/go/heap-trampoline.go
Modified:
    dragonegg/trunk/include/dragonegg/Internals.h
    dragonegg/trunk/src/Convert.cpp

Modified: dragonegg/trunk/include/dragonegg/Internals.h
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/include/dragonegg/Internals.h?rev=182705&r1=182704&r2=182705&view=diff
==============================================================================
--- dragonegg/trunk/include/dragonegg/Internals.h (original)
+++ dragonegg/trunk/include/dragonegg/Internals.h Fri May 24 22:25:43 2013
@@ -651,8 +651,7 @@ private:
                                     llvm::Value *&Result);
   bool EmitBuiltinFrobReturnAddr(gimple_statement_d *stmt,
                                  llvm::Value *&Result);
-  bool EmitBuiltinInitTrampoline(gimple_statement_d *stmt,
-                                 llvm::Value *&Result);
+  bool EmitBuiltinInitTrampoline(gimple_statement_d *stmt, bool OnStack);
   bool EmitBuiltinMemCopy(gimple_statement_d *stmt, llvm::Value *&Result,
                           bool isMemMove, bool SizeCheck);
   bool EmitBuiltinMemSet(gimple_statement_d *stmt, llvm::Value *&Result,

Modified: dragonegg/trunk/src/Convert.cpp
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/src/Convert.cpp?rev=182705&r1=182704&r2=182705&view=diff
==============================================================================
--- dragonegg/trunk/src/Convert.cpp (original)
+++ dragonegg/trunk/src/Convert.cpp Fri May 24 22:25:43 2013
@@ -4325,7 +4325,11 @@ bool TreeToLLVM::EmitBuiltinCall(gimple
   case BUILT_IN_FROB_RETURN_ADDR:
     return EmitBuiltinFrobReturnAddr(stmt, Result);
   case BUILT_IN_INIT_TRAMPOLINE:
-    return EmitBuiltinInitTrampoline(stmt, Result);
+    return EmitBuiltinInitTrampoline(stmt, true);
+#if (GCC_MINOR > 6)
+  case BUILT_IN_INIT_HEAP_TRAMPOLINE:
+    return EmitBuiltinInitTrampoline(stmt, false);
+#endif
   case BUILT_IN_MEMCPY:
     return EmitBuiltinMemCopy(stmt, Result, false, false);
   case BUILT_IN_MEMCPY_CHK:
@@ -6006,8 +6010,7 @@ bool TreeToLLVM::EmitBuiltinCall(gimple
       return true;
     }
 
-    bool TreeToLLVM::EmitBuiltinInitTrampoline(gimple stmt,
-                                               Value * &/*Result*/) {
+    bool TreeToLLVM::EmitBuiltinInitTrampoline(gimple stmt, bool OnStack) {
       if (!validate_gimple_arglist(stmt, POINTER_TYPE, POINTER_TYPE,
                                    POINTER_TYPE, VOID_TYPE))
         return false;
@@ -6024,6 +6027,17 @@ bool TreeToLLVM::EmitBuiltinCall(gimple
       Function *Intr =
           Intrinsic::getDeclaration(TheModule, Intrinsic::init_trampoline);
       Builder.CreateCall(Intr, Ops);
+
+#if (GCC_MINOR > 5)
+      if (OnStack) {
+        tree target = TREE_OPERAND(gimple_call_arg(stmt, 1), 0);
+        warning_at(DECL_SOURCE_LOCATION(target), OPT_Wtrampolines,
+                   "trampoline generated for nested function %qD", target);
+      }
+#else
+      (void)OnStack; // Avoid compiler warning.
+#endif
+
       return true;
     }
 

Added: dragonegg/trunk/test/validator/c/trampoline-warning.c
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/c/trampoline-warning.c?rev=182705&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/c/trampoline-warning.c (added)
+++ dragonegg/trunk/test/validator/c/trampoline-warning.c Fri May 24 22:25:43 2013
@@ -0,0 +1,8 @@
+// RUN: %dragonegg %s -S -Wtrampolines 2>&1 | FileCheck %s
+// CHECK: trampoline generated for nested function
+// XFAIL: gcc-4.5
+void use(int(*)(void));
+void f(int i) {
+  int k(void) { return i; }
+  use(k);
+}

Added: dragonegg/trunk/test/validator/go/heap-trampoline.go
URL: http://llvm.org/viewvc/llvm-project/dragonegg/trunk/test/validator/go/heap-trampoline.go?rev=182705&view=auto
==============================================================================
--- dragonegg/trunk/test/validator/go/heap-trampoline.go (added)
+++ dragonegg/trunk/test/validator/go/heap-trampoline.go Fri May 24 22:25:43 2013
@@ -0,0 +1,19 @@
+// RUN: %dragonegg -S %s -o - | FileCheck %s
+// CHECK-NOT: builtin
+// XFAIL: gcc-4.5
+// PR16015
+
+package main
+
+import "os"
+
+func main() {
+	dummy := 0
+	performance := func(N int) int {
+		for rep := 0; rep < N; rep++ {
+			dummy++
+		}
+		return 0
+	}
+	os.Exit(performance(123))
+}





More information about the llvm-commits mailing list