aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/AST/ByteCode/Compiler.cpp
diff options
context:
space:
mode:
authorTimm Bäder <tbaeder@redhat.com>2025-06-18 15:17:53 +0200
committerTimm Bäder <tbaeder@redhat.com>2025-06-18 15:17:53 +0200
commit68471d29eed2c49f9b439e505b3f24d387d54f97 (patch)
tree120fdcf5f57d336bb824d1197ebc48e66dfef58b /clang/lib/AST/ByteCode/Compiler.cpp
parent8584abb05a84d3bf4e84cdfe4154d7ade8bdfd04 (diff)
downloadllvm-68471d29eed2c49f9b439e505b3f24d387d54f97.zip
llvm-68471d29eed2c49f9b439e505b3f24d387d54f97.tar.gz
llvm-68471d29eed2c49f9b439e505b3f24d387d54f97.tar.bz2
Revert "Reapply "[clang][bytecode] Allocate IntegralAP and Floating types usi… (#144676)"
This reverts commit 7c15edb306932e41c159f3d69c161ed0d89d47b7. This still breaks clang-armv8-quick: https://lab.llvm.org/buildbot/#/builders/154/builds/17587
Diffstat (limited to 'clang/lib/AST/ByteCode/Compiler.cpp')
-rw-r--r--clang/lib/AST/ByteCode/Compiler.cpp112
1 files changed, 49 insertions, 63 deletions
diff --git a/clang/lib/AST/ByteCode/Compiler.cpp b/clang/lib/AST/ByteCode/Compiler.cpp
index 3f884ed..9fe4803 100644
--- a/clang/lib/AST/ByteCode/Compiler.cpp
+++ b/clang/lib/AST/ByteCode/Compiler.cpp
@@ -748,8 +748,7 @@ bool Compiler<Emitter>::VisitFloatingLiteral(const FloatingLiteral *E) {
if (DiscardResult)
return true;
- APFloat F = E->getValue();
- return this->emitFloat(F, E);
+ return this->emitConstFloat(E->getValue(), E);
}
template <class Emitter>
@@ -4186,10 +4185,8 @@ bool Compiler<Emitter>::visitZeroInitializer(PrimType T, QualType QT,
nullptr, E);
case PT_MemberPtr:
return this->emitNullMemberPtr(0, nullptr, E);
- case PT_Float: {
- APFloat F = APFloat::getZero(Ctx.getFloatSemantics(QT));
- return this->emitFloat(F, E);
- }
+ case PT_Float:
+ return this->emitConstFloat(APFloat::getZero(Ctx.getFloatSemantics(QT)), E);
case PT_FixedPoint: {
auto Sem = Ctx.getASTContext().getFixedPointSemantics(E->getType());
return this->emitConstFixedPoint(FixedPoint::zero(Sem), E);
@@ -4677,7 +4674,10 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD,
if (!visitInitializer(Init))
return false;
- return this->emitFinishInitGlobal(Init);
+ if (!this->emitFinishInit(Init))
+ return false;
+
+ return this->emitPopPtr(Init);
};
DeclScope<Emitter> LocalScope(this, VD);
@@ -4698,45 +4698,51 @@ VarCreationState Compiler<Emitter>::visitVarDecl(const VarDecl *VD,
return false;
return !Init || (checkDecl() && initGlobal(*GlobalIndex));
- }
- // Local variables.
- InitLinkScope<Emitter> ILS(this, InitLink::Decl(VD));
+ } else {
+ InitLinkScope<Emitter> ILS(this, InitLink::Decl(VD));
- if (VarT) {
- unsigned Offset = this->allocateLocalPrimitive(
- VD, *VarT, VD->getType().isConstQualified(), nullptr, ScopeKind::Block,
- IsConstexprUnknown);
- if (Init) {
- // If this is a toplevel declaration, create a scope for the
- // initializer.
- if (Toplevel) {
- LocalScope<Emitter> Scope(this);
- if (!this->visit(Init))
- return false;
- return this->emitSetLocal(*VarT, Offset, VD) && Scope.destroyLocals();
- } else {
- if (!this->visit(Init))
- return false;
- return this->emitSetLocal(*VarT, Offset, VD);
+ if (VarT) {
+ unsigned Offset = this->allocateLocalPrimitive(
+ VD, *VarT, VD->getType().isConstQualified(), nullptr,
+ ScopeKind::Block, IsConstexprUnknown);
+ if (Init) {
+ // If this is a toplevel declaration, create a scope for the
+ // initializer.
+ if (Toplevel) {
+ LocalScope<Emitter> Scope(this);
+ if (!this->visit(Init))
+ return false;
+ return this->emitSetLocal(*VarT, Offset, VD) && Scope.destroyLocals();
+ } else {
+ if (!this->visit(Init))
+ return false;
+ return this->emitSetLocal(*VarT, Offset, VD);
+ }
}
- }
- } else {
- if (std::optional<unsigned> Offset = this->allocateLocal(
- VD, VD->getType(), nullptr, ScopeKind::Block, IsConstexprUnknown)) {
- if (!Init)
- return true;
+ } else {
+ if (std::optional<unsigned> Offset =
+ this->allocateLocal(VD, VD->getType(), nullptr, ScopeKind::Block,
+ IsConstexprUnknown)) {
+ if (!Init)
+ return true;
- if (!this->emitGetPtrLocal(*Offset, Init))
- return false;
+ if (!this->emitGetPtrLocal(*Offset, Init))
+ return false;
- if (!visitInitializer(Init))
- return false;
+ if (!visitInitializer(Init))
+ return false;
+
+ if (!this->emitFinishInit(Init))
+ return false;
- return this->emitFinishInitPop(Init);
+ return this->emitPopPtr(Init);
+ }
+ return false;
}
- return false;
+ return true;
}
- return true;
+
+ return false;
}
template <class Emitter>
@@ -4745,10 +4751,8 @@ bool Compiler<Emitter>::visitAPValue(const APValue &Val, PrimType ValType,
assert(!DiscardResult);
if (Val.isInt())
return this->emitConst(Val.getInt(), ValType, E);
- else if (Val.isFloat()) {
- APFloat F = Val.getFloat();
- return this->emitFloat(F, E);
- }
+ else if (Val.isFloat())
+ return this->emitConstFloat(Val.getFloat(), E);
if (Val.isLValue()) {
if (Val.isNullPointer())
@@ -6129,10 +6133,8 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
const auto &TargetSemantics = Ctx.getFloatSemantics(E->getType());
if (!this->emitLoadFloat(E))
return false;
- APFloat F(TargetSemantics, 1);
- if (!this->emitFloat(F, E))
+ if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E))
return false;
-
if (!this->emitAddf(getFPOptions(E), E))
return false;
if (!this->emitStoreFloat(E))
@@ -6174,10 +6176,8 @@ bool Compiler<Emitter>::VisitUnaryOperator(const UnaryOperator *E) {
const auto &TargetSemantics = Ctx.getFloatSemantics(E->getType());
if (!this->emitLoadFloat(E))
return false;
- APFloat F(TargetSemantics, 1);
- if (!this->emitFloat(F, E))
+ if (!this->emitConstFloat(llvm::APFloat(TargetSemantics, 1), E))
return false;
-
if (!this->emitSubf(getFPOptions(E), E))
return false;
if (!this->emitStoreFloat(E))
@@ -6953,20 +6953,6 @@ bool Compiler<Emitter>::emitDummyPtr(const DeclTy &D, const Expr *E) {
return true;
}
-template <class Emitter>
-bool Compiler<Emitter>::emitFloat(const APFloat &F, const Expr *E) {
- assert(!DiscardResult && "Should've been checked before");
-
- if (Floating::singleWord(F.getSemantics()))
- return this->emitConstFloat(Floating(F), E);
-
- APInt I = F.bitcastToAPInt();
- return this->emitConstFloat(
- Floating(const_cast<uint64_t *>(I.getRawData()),
- llvm::APFloatBase::SemanticsToEnum(F.getSemantics())),
- E);
-}
-
// This function is constexpr if and only if To, From, and the types of
// all subobjects of To and From are types T such that...
// (3.1) - is_union_v<T> is false;