diff options
author | Timm Bäder <tbaeder@redhat.com> | 2024-06-20 20:15:41 +0200 |
---|---|---|
committer | Timm Bäder <tbaeder@redhat.com> | 2024-06-20 20:29:27 +0200 |
commit | 99f5fcb0d1e04125daa404ff14c9cd14b7a2c40b (patch) | |
tree | 2f279b0205a1756404179f9e808c36fb6fdc7b33 | |
parent | 01ce74fe14fb98af42a3f2f7c8c6b04487761cf1 (diff) | |
download | llvm-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.cpp | 19 |
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 { |