|
@@ -760,6 +760,8 @@ SpirvInstruction *SpirvEmitter::doExpr(const Expr *expr) {
|
|
result = curThis;
|
|
result = curThis;
|
|
} else if (isa<CXXConstructExpr>(expr)) {
|
|
} else if (isa<CXXConstructExpr>(expr)) {
|
|
result = curThis;
|
|
result = curThis;
|
|
|
|
+ } else if (const auto *unaryExpr = dyn_cast<UnaryExprOrTypeTraitExpr>(expr)) {
|
|
|
|
+ result = doUnaryExprOrTypeTraitExpr(unaryExpr);
|
|
} else {
|
|
} else {
|
|
emitError("expression class '%0' unimplemented", expr->getExprLoc())
|
|
emitError("expression class '%0' unimplemented", expr->getExprLoc())
|
|
<< expr->getStmtClassName() << expr->getSourceRange();
|
|
<< expr->getStmtClassName() << expr->getSourceRange();
|
|
@@ -11675,5 +11677,25 @@ bool SpirvEmitter::spirvToolsLegalize(std::vector<uint32_t> *mod,
|
|
return optimizer.Run(mod->data(), mod->size(), mod, options);
|
|
return optimizer.Run(mod->data(), mod->size(), mod, options);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+SpirvInstruction *
|
|
|
|
+SpirvEmitter::doUnaryExprOrTypeTraitExpr(const UnaryExprOrTypeTraitExpr *expr) {
|
|
|
|
+ // TODO: We support only `sizeof()`. Support other kinds.
|
|
|
|
+ if (expr->getKind() != clang::UnaryExprOrTypeTrait::UETT_SizeOf) {
|
|
|
|
+ emitError("expression class '%0' unimplemented", expr->getExprLoc())
|
|
|
|
+ << expr->getStmtClassName();
|
|
|
|
+ return nullptr;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ AlignmentSizeCalculator alignmentCalc(astContext, spirvOptions);
|
|
|
|
+ uint32_t size = 0, stride = 0;
|
|
|
|
+ std::tie(std::ignore, size) = alignmentCalc.getAlignmentAndSize(
|
|
|
|
+ expr->getArgumentType(), SpirvLayoutRule::Void,
|
|
|
|
+ /*isRowMajor*/ llvm::None, &stride);
|
|
|
|
+ auto *sizeConst = spvBuilder.getConstantInt(astContext.UnsignedIntTy,
|
|
|
|
+ llvm::APInt(32, size));
|
|
|
|
+ sizeConst->setRValue();
|
|
|
|
+ return sizeConst;
|
|
|
|
+}
|
|
|
|
+
|
|
} // end namespace spirv
|
|
} // end namespace spirv
|
|
} // end namespace clang
|
|
} // end namespace clang
|