Commit 3aee3bf4 authored by Tom Stellard's avatar Tom Stellard
Browse files

Merging r197036:

------------------------------------------------------------------------
r197036 | david.tweed | 2013-12-11 08:39:46 -0500 (Wed, 11 Dec 2013) | 8 lines

Add front-end infrastructure now address space casts are in LLVM IR.

With the introduction of explicit address space casts into LLVM, there's
a need to provide a new cast kind the front-end can create for C/OpenCL/CUDA
and code to produce address space casts from those kinds when appropriate.

Patch by Michele Scandale!

------------------------------------------------------------------------

llvm-svn: 209029
parent b358fb9d
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -295,7 +295,10 @@ enum CastKind {
  CK_BuiltinFnToFnPtr,

  // Convert a zero value for OpenCL event_t initialization.
  CK_ZeroToOCLEvent
  CK_ZeroToOCLEvent,

  // Convert a pointer to a different address space.
  CK_AddressSpaceConversion
};

static const CastKind CK_Invalid = static_cast<CastKind>(-1);
+7 −0
Original line number Diff line number Diff line
@@ -1474,6 +1474,11 @@ void CastExpr::CheckCastConsistency() const {
    assert(getSubExpr()->getType()->isFunctionType());
    goto CheckNoBasePath;

  case CK_AddressSpaceConversion:
    assert(getType()->isPointerType());
    assert(getSubExpr()->getType()->isPointerType());
    assert(getType()->getPointeeType().getAddressSpace() !=
           getSubExpr()->getType()->getPointeeType().getAddressSpace());
  // These should not have an inheritance path.
  case CK_Dynamic:
  case CK_ToUnion:
@@ -1636,6 +1641,8 @@ const char *CastExpr::getCastKindName() const {
    return "BuiltinFnToFnPtr";
  case CK_ZeroToOCLEvent:
    return "ZeroToOCLEvent";
  case CK_AddressSpaceConversion:
    return "AddressSpaceConversion";
  }

  llvm_unreachable("Unhandled cast kind!");
+2 −0
Original line number Diff line number Diff line
@@ -7109,6 +7109,7 @@ bool IntExprEvaluator::VisitCastExpr(const CastExpr *E) {
  case CK_BuiltinFnToFnPtr:
  case CK_ZeroToOCLEvent:
  case CK_NonAtomicToAtomic:
  case CK_AddressSpaceConversion:
    llvm_unreachable("invalid cast kind for integral value");

  case CK_BitCast:
@@ -7581,6 +7582,7 @@ bool ComplexExprEvaluator::VisitCastExpr(const CastExpr *E) {
  case CK_BuiltinFnToFnPtr:
  case CK_ZeroToOCLEvent:
  case CK_NonAtomicToAtomic:
  case CK_AddressSpaceConversion:
    llvm_unreachable("invalid cast kind for complex value");

  case CK_LValueToRValue:
+1 −0
Original line number Diff line number Diff line
@@ -2744,6 +2744,7 @@ LValue CodeGenFunction::EmitCastLValue(const CastExpr *E) {
  case CK_ARCReclaimReturnedObject:
  case CK_ARCExtendBlockObject:
  case CK_CopyAndAutoreleaseBlockObject:
  case CK_AddressSpaceConversion:
    return EmitUnsupportedLValue(E, "unexpected cast lvalue");

  case CK_Dependent:
+1 −0
Original line number Diff line number Diff line
@@ -713,6 +713,7 @@ void AggExprEmitter::VisitCastExpr(CastExpr *E) {
  case CK_CopyAndAutoreleaseBlockObject:
  case CK_BuiltinFnToFnPtr:
  case CK_ZeroToOCLEvent:
  case CK_AddressSpaceConversion:
    llvm_unreachable("cast kind invalid for aggregate types");
  }
}
Loading