aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <tbaeder@redhat.com>2024-06-20 20:15:41 +0200
committerTimm Bäder <tbaeder@redhat.com>2024-06-20 20:29:27 +0200
commit99f5fcb0d1e04125daa404ff14c9cd14b7a2c40b (patch)
tree2f279b0205a1756404179f9e808c36fb6fdc7b33
parent01ce74fe14fb98af42a3f2f7c8c6b04487761cf1 (diff)
downloadllvm-99f5fcb0d1e04125daa404ff14c9cd14b7a2c40b.zip
llvm-99f5fcb0d1e04125daa404ff14c9cd14b7a2c40b.tar.gz
llvm-99f5fcb0d1e04125daa404ff14c9cd14b7a2c40b.tar.bz2
[clang][Interp] Try to fix #embed on big-endian machines
Insert a cast to the proper value.
-rw-r--r--clang/lib/AST/Interp/ByteCodeExprGen.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/clang/lib/AST/Interp/ByteCodeExprGen.cpp b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
index b188732..034e479 100644
--- a/clang/lib/AST/Interp/ByteCodeExprGen.cpp
+++ b/clang/lib/AST/Interp/ByteCodeExprGen.cpp
@@ -1346,13 +1346,22 @@ bool ByteCodeExprGen<Emitter>::visitInitList(ArrayRef<const Expr *> Inits,
}
}
- auto Eval = [&](Expr *Init, unsigned ElemIndex) {
- return visitArrayElemInit(ElemIndex, Init);
- };
-
unsigned ElementIndex = 0;
for (const Expr *Init : Inits) {
- if (auto *EmbedS = dyn_cast<EmbedExpr>(Init->IgnoreParenImpCasts())) {
+ if (const auto *EmbedS =
+ dyn_cast<EmbedExpr>(Init->IgnoreParenImpCasts())) {
+ PrimType TargetT = classifyPrim(Init->getType());
+
+ auto Eval = [&](const Expr *Init, unsigned ElemIndex) {
+ PrimType InitT = classifyPrim(Init->getType());
+ if (!this->visit(Init))
+ return false;
+ if (InitT != TargetT) {
+ if (!this->emitCast(InitT, TargetT, E))
+ return false;
+ }
+ return this->emitInitElem(TargetT, ElemIndex, Init);
+ };
if (!EmbedS->doForEachDataElement(Eval, ElementIndex))
return false;
} else {