]> granicus.if.org Git - clang/commitdiff
Sketch out an implementation for __builtin_dwarf_cfa. I have no idea
authorJohn McCall <rjmccall@apple.com>
Wed, 3 Mar 2010 10:30:05 +0000 (10:30 +0000)
committerJohn McCall <rjmccall@apple.com>
Wed, 3 Mar 2010 10:30:05 +0000 (10:30 +0000)
why the front-end is calculating the argument to llvm.eh.dwarf.cfa().

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@97653 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/CGBuiltin.cpp

index faea4fe9d439c425a473c104a3a8b2ea29c4f8f8..0f5e90fb15aaf40aed5b7e5a7ae0bcf518ba926e 100644 (file)
@@ -59,6 +59,10 @@ static RValue EmitBinaryAtomicPost(CodeGenFunction& CGF,
   return RValue::get(CGF.Builder.CreateBinOp(Op, Result, Operand));
 }
 
+static llvm::ConstantInt *getInt32(llvm::LLVMContext &Context, int32_t Value) {
+  return llvm::ConstantInt::get(llvm::Type::getInt32Ty(Context), Value);
+}
+
 RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
                                         unsigned BuiltinID, const CallExpr *E) {
   // See if we can constant fold this builtin.  If so, don't emit it at all.
@@ -343,6 +347,20 @@ RValue CodeGenFunction::EmitBuiltinExpr(const FunctionDecl *FD,
                         llvm::ConstantInt::get(llvm::Type::getInt32Ty(VMContext), 1));
     return RValue::get(Address);
   }
+  case Builtin::BI__builtin_dwarf_cfa: {
+    // The offset in bytes from the first argument to the CFA.
+    //
+    // Why on earth is this in the frontend?  Is there any reason at
+    // all that the backend can't reasonably determine this while
+    // lowering llvm.eh.dwarf.cfa()?
+    //
+    // TODO: If there's a satisfactory reason, add a target hook for
+    // this instead of hard-coding 0, which is correct for most targets.
+    int32_t Offset = 0;
+
+    Value *F = CGM.getIntrinsic(Intrinsic::eh_dwarf_cfa, 0, 0);
+    return RValue::get(Builder.CreateCall(F, getInt32(VMContext, Offset)));
+  }
   case Builtin::BI__builtin_return_address: {
     Value *Depth = EmitScalarExpr(E->getArg(0));
     Depth = Builder.CreateIntCast(Depth,