[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