diff options
Diffstat (limited to 'CodeGen')
-rw-r--r-- | CodeGen/CGBuiltin.cpp | 19 | ||||
-rw-r--r-- | CodeGen/CGExprScalar.cpp | 5 | ||||
-rw-r--r-- | CodeGen/CodeGenFunction.cpp | 4 |
3 files changed, 25 insertions, 3 deletions
diff --git a/CodeGen/CGBuiltin.cpp b/CodeGen/CGBuiltin.cpp index 6dbd272521..2ca84e25d4 100644 --- a/CodeGen/CGBuiltin.cpp +++ b/CodeGen/CGBuiltin.cpp @@ -18,6 +18,8 @@ #include "clang/AST/Expr.h" #include "llvm/Constants.h" #include "llvm/Function.h" +#include "llvm/Intrinsics.h" + using namespace clang; using namespace CodeGen; @@ -45,7 +47,22 @@ RValue CodeGenFunction::EmitBuiltinExpr(unsigned BuiltinID, const CallExpr *E) { std::string S(Literal->getStrData(), Literal->getByteLength()); return RValue::get(CGM.GetAddrOfConstantCFString(S)); - } + } + case Builtin::BI__builtin_va_start: + case Builtin::BI__builtin_va_end: { + llvm::Value *ArgValue = EmitScalarExpr(E->getArg(0)); + const llvm::Type *DestType = llvm::PointerType::get(llvm::Type::Int8Ty); + if (ArgValue->getType() != DestType) + ArgValue = Builder.CreateBitCast(ArgValue, DestType, + ArgValue->getNameStart()); + + llvm::Intrinsic::ID inst = (BuiltinID == Builtin::BI__builtin_va_start) ? + llvm::Intrinsic::vastart : llvm::Intrinsic::vaend; + llvm::Value *F = llvm::Intrinsic::getDeclaration(&CGM.getModule(), inst); + llvm::Value *V = Builder.CreateCall(F, ArgValue); + + return RValue::get(V); + } } return RValue::get(0); diff --git a/CodeGen/CGExprScalar.cpp b/CodeGen/CGExprScalar.cpp index cd5c078b5c..755fd56de6 100644 --- a/CodeGen/CGExprScalar.cpp +++ b/CodeGen/CGExprScalar.cpp @@ -418,6 +418,11 @@ Value *ScalarExprEmitter::VisitImplicitCastExpr(const ImplicitCastExpr *E) { llvm::Value *Ops[] = {Idx0, Idx0}; return Builder.CreateGEP(V, Ops, Ops+2, "arraydecay"); + } else if (E->getType()->isReferenceType()) { + assert(cast<ReferenceType>(E->getType())->getReferenceeType() == + Op->getType() && "Incompatible types!"); + + return EmitLValue(Op).getAddress(); } return EmitCastExpr(Op, E->getType()); diff --git a/CodeGen/CodeGenFunction.cpp b/CodeGen/CodeGenFunction.cpp index 80c75afdb8..1457ec5606 100644 --- a/CodeGen/CodeGenFunction.cpp +++ b/CodeGen/CodeGenFunction.cpp @@ -46,8 +46,8 @@ const llvm::Type *CodeGenFunction::ConvertType(QualType T) { } bool CodeGenFunction::hasAggregateLLVMType(QualType T) { - return !T->isRealType() && !T->isPointerType() && !T->isVoidType() && - !T->isVectorType() && !T->isFunctionType(); + return !T->isRealType() && !T->isPointerType() && !T->isReferenceType() && + !T->isVoidType() && !T->isVectorType() && !T->isFunctionType(); } |