-
Notifications
You must be signed in to change notification settings - Fork 14.4k
[clang][bytecode] Fix assignInteger() with allocated primtypes #145302
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
@llvm/pr-subscribers-clang Author: Timm Baeder (tbaederr) ChangesFull diff: https://github.com/llvm/llvm-project/pull/145302.diff 2 Files Affected:
diff --git a/clang/lib/AST/ByteCode/InterpBuiltin.cpp b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
index 5304bd77f2c06..ea96e21ea9447 100644
--- a/clang/lib/AST/ByteCode/InterpBuiltin.cpp
+++ b/clang/lib/AST/ByteCode/InterpBuiltin.cpp
@@ -96,10 +96,21 @@ static void pushInteger(InterpState &S, T Val, QualType QT) {
QT);
}
-static void assignInteger(const Pointer &Dest, PrimType ValueT,
+static void assignInteger(InterpState &S, const Pointer &Dest, PrimType ValueT,
const APSInt &Value) {
- INT_TYPE_SWITCH_NO_BOOL(
- ValueT, { Dest.deref<T>() = T::from(static_cast<T>(Value)); });
+
+ if (ValueT == PT_IntAPS) {
+ Dest.deref<IntegralAP<true>>() =
+ S.allocAP<IntegralAP<true>>(Value.getBitWidth());
+ Dest.deref<IntegralAP<true>>().copy(Value);
+ } else if (ValueT == PT_IntAP) {
+ Dest.deref<IntegralAP<false>>() =
+ S.allocAP<IntegralAP<false>>(Value.getBitWidth());
+ Dest.deref<IntegralAP<false>>().copy(Value);
+ } else {
+ INT_TYPE_SWITCH_NO_BOOL(
+ ValueT, { Dest.deref<T>() = T::from(static_cast<T>(Value)); });
+ }
}
static QualType getElemType(const Pointer &P) {
@@ -849,7 +860,7 @@ static bool interp__builtin_overflowop(InterpState &S, CodePtr OpPC,
}
// Write Result to ResultPtr and put Overflow on the stack.
- assignInteger(ResultPtr, ResultT, Result);
+ assignInteger(S, ResultPtr, ResultT, Result);
ResultPtr.initialize();
assert(Call->getDirectCallee()->getReturnType()->isBooleanType());
S.Stk.push<Boolean>(Overflow);
@@ -902,7 +913,7 @@ static bool interp__builtin_carryop(InterpState &S, CodePtr OpPC,
QualType CarryOutType = Call->getArg(3)->getType()->getPointeeType();
PrimType CarryOutT = *S.getContext().classify(CarryOutType);
- assignInteger(CarryOutPtr, CarryOutT, CarryOut);
+ assignInteger(S, CarryOutPtr, CarryOutT, CarryOut);
CarryOutPtr.initialize();
assert(Call->getType() == Call->getArg(0)->getType());
@@ -1414,7 +1425,7 @@ static bool interp__builtin_ia32_addcarry_subborrow(InterpState &S,
QualType CarryOutType = Call->getArg(3)->getType()->getPointeeType();
PrimType CarryOutT = *S.getContext().classify(CarryOutType);
- assignInteger(CarryOutPtr, CarryOutT, APSInt(Result, true));
+ assignInteger(S, CarryOutPtr, CarryOutT, APSInt(Result, true));
pushInteger(S, CarryOut, Call->getType());
diff --git a/clang/test/AST/ByteCode/builtin-functions.cpp b/clang/test/AST/ByteCode/builtin-functions.cpp
index 174c1ffa79a43..3b95a8ea48596 100644
--- a/clang/test/AST/ByteCode/builtin-functions.cpp
+++ b/clang/test/AST/ByteCode/builtin-functions.cpp
@@ -1739,4 +1739,18 @@ namespace WithinLifetime {
// both-warning {{expression result unused}}
}
}
+
+#ifdef __SIZEOF_INT128__
+namespace I128Mul {
+ constexpr int mul() {
+ __int128 A = 10;
+ __int128 B = 10;
+ __int128 R;
+ __builtin_mul_overflow(A, B, &R);
+ return 1;
+ }
+ static_assert(mul() == 1);
+}
+#endif
+
#endif
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/108/builds/14393 Here is the relevant piece of the build log for the reference
|
LLVM Buildbot has detected a new failure on builder Full details are available at: https://lab.llvm.org/buildbot/#/builders/186/builds/10118 Here is the relevant piece of the build log for the reference
|
No description provided.