summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/CodeGen/CGBuiltin.cpp15
-rw-r--r--clang/test/CodeGen/builtins.c7
2 files changed, 22 insertions, 0 deletions
diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
index df6ac7fc243..37435cd8150 100644
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -21,6 +21,9 @@
#include "clang/Basic/TargetBuiltins.h"
#include "llvm/Intrinsics.h"
#include "llvm/Target/TargetData.h"
+#include "llvm/Target/TargetLowering.h"
+#include "llvm/Target/TargetMachine.h"
+#include "llvm/Target/TargetRegisterInfo.h"
using namespace clang;
using namespace CodeGen;
using namespace llvm;
@@ -407,6 +410,18 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
Value *F = CGM.getIntrinsic(Intrinsic::eh_unwind_init, 0, 0);
return RValue::get(Builder.CreateCall(F));
}
+ case Builtin::BI__builtin_dwarf_sp_column: {
+ const llvm::TargetMachine &Machine = CGM.getTargetMachine();
+ llvm::TargetLowering *TL = Machine.getTargetLowering();
+ assert(TL && "need lowering to codegen __builtin_dwarf_sp_column");
+ const llvm::TargetRegisterInfo *TRI = Machine.getRegisterInfo();
+ assert(TRI && "need register info to codegen __builtin_dwarf_sp_column");
+ unsigned SP = TL->getStackPointerRegisterToSaveRestore();
+ int DwarfSP = TRI->getDwarfRegNum(SP, /*for EH*/ true);
+
+ return RValue::get(
+ llvm::ConstantInt::getSigned(cast<IntegerType>(LLVMIntTy), DwarfSP));
+ }
case Builtin::BI__builtin_extend_pointer: {
// Extends a pointer to the size of an _Unwind_Word, which is
// uint64_t on all platforms. Generally this gets poked into a
diff --git a/clang/test/CodeGen/builtins.c b/clang/test/CodeGen/builtins.c
index 417ca7def5f..70d0857a315 100644
--- a/clang/test/CodeGen/builtins.c
+++ b/clang/test/CodeGen/builtins.c
@@ -162,3 +162,10 @@ void bar() {
}
// CHECK: }
+
+// CHECK: define void @test0(
+void test0() {
+ // CHECK: i64 7
+ unsigned long long x = __builtin_dwarf_sp_column();
+}
+// CHECK: }
OpenPOWER on IntegriCloud