]> granicus.if.org Git - clang/commitdiff
Implement __builtin_dwarf_sp_column().
authorJohn McCall <rjmccall@apple.com>
Thu, 4 Mar 2010 00:44:01 +0000 (00:44 +0000)
committerJohn McCall <rjmccall@apple.com>
Thu, 4 Mar 2010 00:44:01 +0000 (00:44 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97700 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBuiltin.cpp
test/CodeGen/builtins.c

index df6ac7fc243fc4c35ad7cc534c47439b56f43e3b..37435cd81506a405fd2015e5dcc341c927059dda 100644 (file)
@@ -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
index 417ca7def5f2bc412b232a59bea494b0748a6dcd..70d0857a315d260718883a2e1251c3a814b8fe24 100644 (file)
@@ -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: }