aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Friedman <eli.friedman@gmail.com>2009-05-03 19:23:23 +0000
committerEli Friedman <eli.friedman@gmail.com>2009-05-03 19:23:23 +0000
commit3b660efb9f9fa3e87096f4a96a2093cd17c43c2e (patch)
treed3b224cd3a3e787ef480dc148d760a6f8d77eff0
parentd9b856fddd07b48388307127687a634235271849 (diff)
PR4134: Implement __builtin_extract_return_addr.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@70794 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/clang/AST/Builtins.def1
-rw-r--r--lib/CodeGen/CGBuiltin.cpp5
-rw-r--r--test/CodeGen/builtins.c1
3 files changed, 6 insertions, 1 deletions
diff --git a/include/clang/AST/Builtins.def b/include/clang/AST/Builtins.def
index c51ba69b8c..a14c9d85b0 100644
--- a/include/clang/AST/Builtins.def
+++ b/include/clang/AST/Builtins.def
@@ -162,6 +162,7 @@ BUILTIN(__builtin_strrchr, "c*cC*i", "nF")
BUILTIN(__builtin_strspn, "zcC*cC*", "nF")
BUILTIN(__builtin_strstr, "c*cC*cC*", "nF")
BUILTIN(__builtin_return_address, "v*Ui", "n")
+BUILTIN(__builtin_extract_return_addr, "v*v*", "n")
BUILTIN(__builtin_frame_address, "v*Ui", "n")
BUILTIN(__builtin_flt_rounds, "i", "nc")
BUILTIN(__builtin_setjmp, "iv**", "")
diff --git a/lib/CodeGen/CGBuiltin.cpp b/lib/CodeGen/CGBuiltin.cpp
index 2b9a17845d..d14bb53e6f 100644
--- a/lib/CodeGen/CGBuiltin.cpp
+++ b/lib/CodeGen/CGBuiltin.cpp
@@ -310,7 +310,10 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Value *F = CGM.getIntrinsic(Intrinsic::frameaddress, 0, 0);
return RValue::get(Builder.CreateCall(F, EmitScalarExpr(E->getArg(0))));
}
-
+ case Builtin::BI__builtin_extract_return_addr: {
+ // FIXME: There should be a target hook for this
+ return RValue::get(EmitScalarExpr(E->getArg(0)));
+ }
case Builtin::BI__sync_fetch_and_add:
return EmitBinaryAtomic(*this, Intrinsic::atomic_load_add, E);
case Builtin::BI__sync_fetch_and_sub:
diff --git a/test/CodeGen/builtins.c b/test/CodeGen/builtins.c
index 8735cc613b..ce5cd74bd4 100644
--- a/test/CodeGen/builtins.c
+++ b/test/CodeGen/builtins.c
@@ -109,6 +109,7 @@ int main() {
// FIXME
// V(clear_cache, (&N, &N+1));
V(trap, ());
+ P(extract_return_addr, (&N));
return 0;
}