Path: blob/main/contrib/llvm-project/llvm/lib/SandboxIR/Constant.cpp
213766 views
//===- Constant.cpp - The Constant classes of Sandbox IR ------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "llvm/SandboxIR/Constant.h"9#include "llvm/SandboxIR/BasicBlock.h"10#include "llvm/SandboxIR/Context.h"11#include "llvm/SandboxIR/Function.h"12#include "llvm/Support/Compiler.h"1314namespace llvm::sandboxir {1516#ifndef NDEBUG17void Constant::dumpOS(raw_ostream &OS) const {18dumpCommonPrefix(OS);19dumpCommonSuffix(OS);20}21#endif // NDEBUG2223ConstantInt *ConstantInt::getTrue(Context &Ctx) {24auto *LLVMC = llvm::ConstantInt::getTrue(Ctx.LLVMCtx);25return cast<ConstantInt>(Ctx.getOrCreateConstant(LLVMC));26}27ConstantInt *ConstantInt::getFalse(Context &Ctx) {28auto *LLVMC = llvm::ConstantInt::getFalse(Ctx.LLVMCtx);29return cast<ConstantInt>(Ctx.getOrCreateConstant(LLVMC));30}31ConstantInt *ConstantInt::getBool(Context &Ctx, bool V) {32auto *LLVMC = llvm::ConstantInt::getBool(Ctx.LLVMCtx, V);33return cast<ConstantInt>(Ctx.getOrCreateConstant(LLVMC));34}35Constant *ConstantInt::getTrue(Type *Ty) {36auto *LLVMC = llvm::ConstantInt::getTrue(Ty->LLVMTy);37return Ty->getContext().getOrCreateConstant(LLVMC);38}39Constant *ConstantInt::getFalse(Type *Ty) {40auto *LLVMC = llvm::ConstantInt::getFalse(Ty->LLVMTy);41return Ty->getContext().getOrCreateConstant(LLVMC);42}43Constant *ConstantInt::getBool(Type *Ty, bool V) {44auto *LLVMC = llvm::ConstantInt::getBool(Ty->LLVMTy, V);45return Ty->getContext().getOrCreateConstant(LLVMC);46}47ConstantInt *ConstantInt::get(Type *Ty, uint64_t V, bool IsSigned) {48auto *LLVMC = llvm::ConstantInt::get(Ty->LLVMTy, V, IsSigned);49return cast<ConstantInt>(Ty->getContext().getOrCreateConstant(LLVMC));50}51ConstantInt *ConstantInt::get(IntegerType *Ty, uint64_t V, bool IsSigned) {52auto *LLVMC = llvm::ConstantInt::get(Ty->LLVMTy, V, IsSigned);53return cast<ConstantInt>(Ty->getContext().getOrCreateConstant(LLVMC));54}55ConstantInt *ConstantInt::getSigned(IntegerType *Ty, int64_t V) {56auto *LLVMC =57llvm::ConstantInt::getSigned(cast<llvm::IntegerType>(Ty->LLVMTy), V);58return cast<ConstantInt>(Ty->getContext().getOrCreateConstant(LLVMC));59}60Constant *ConstantInt::getSigned(Type *Ty, int64_t V) {61auto *LLVMC = llvm::ConstantInt::getSigned(Ty->LLVMTy, V);62return Ty->getContext().getOrCreateConstant(LLVMC);63}64ConstantInt *ConstantInt::get(Context &Ctx, const APInt &V) {65auto *LLVMC = llvm::ConstantInt::get(Ctx.LLVMCtx, V);66return cast<ConstantInt>(Ctx.getOrCreateConstant(LLVMC));67}68ConstantInt *ConstantInt::get(IntegerType *Ty, StringRef Str, uint8_t Radix) {69auto *LLVMC =70llvm::ConstantInt::get(cast<llvm::IntegerType>(Ty->LLVMTy), Str, Radix);71return cast<ConstantInt>(Ty->getContext().getOrCreateConstant(LLVMC));72}73Constant *ConstantInt::get(Type *Ty, const APInt &V) {74auto *LLVMC = llvm::ConstantInt::get(Ty->LLVMTy, V);75return Ty->getContext().getOrCreateConstant(LLVMC);76}77IntegerType *ConstantInt::getIntegerType() const {78auto *LLVMTy = cast<llvm::ConstantInt>(Val)->getIntegerType();79return cast<IntegerType>(Ctx.getType(LLVMTy));80}8182bool ConstantInt::isValueValidForType(Type *Ty, uint64_t V) {83return llvm::ConstantInt::isValueValidForType(Ty->LLVMTy, V);84}85bool ConstantInt::isValueValidForType(Type *Ty, int64_t V) {86return llvm::ConstantInt::isValueValidForType(Ty->LLVMTy, V);87}8889Constant *ConstantFP::get(Type *Ty, double V) {90auto *LLVMC = llvm::ConstantFP::get(Ty->LLVMTy, V);91return Ty->getContext().getOrCreateConstant(LLVMC);92}9394Constant *ConstantFP::get(Type *Ty, const APFloat &V) {95auto *LLVMC = llvm::ConstantFP::get(Ty->LLVMTy, V);96return Ty->getContext().getOrCreateConstant(LLVMC);97}9899Constant *ConstantFP::get(Type *Ty, StringRef Str) {100auto *LLVMC = llvm::ConstantFP::get(Ty->LLVMTy, Str);101return Ty->getContext().getOrCreateConstant(LLVMC);102}103104ConstantFP *ConstantFP::get(const APFloat &V, Context &Ctx) {105auto *LLVMC = llvm::ConstantFP::get(Ctx.LLVMCtx, V);106return cast<ConstantFP>(Ctx.getOrCreateConstant(LLVMC));107}108109Constant *ConstantFP::getNaN(Type *Ty, bool Negative, uint64_t Payload) {110auto *LLVMC = llvm::ConstantFP::getNaN(Ty->LLVMTy, Negative, Payload);111return cast<Constant>(Ty->getContext().getOrCreateConstant(LLVMC));112}113Constant *ConstantFP::getQNaN(Type *Ty, bool Negative, APInt *Payload) {114auto *LLVMC = llvm::ConstantFP::getQNaN(Ty->LLVMTy, Negative, Payload);115return cast<Constant>(Ty->getContext().getOrCreateConstant(LLVMC));116}117Constant *ConstantFP::getSNaN(Type *Ty, bool Negative, APInt *Payload) {118auto *LLVMC = llvm::ConstantFP::getSNaN(Ty->LLVMTy, Negative, Payload);119return cast<Constant>(Ty->getContext().getOrCreateConstant(LLVMC));120}121Constant *ConstantFP::getZero(Type *Ty, bool Negative) {122auto *LLVMC = llvm::ConstantFP::getZero(Ty->LLVMTy, Negative);123return cast<Constant>(Ty->getContext().getOrCreateConstant(LLVMC));124}125Constant *ConstantFP::getNegativeZero(Type *Ty) {126auto *LLVMC = llvm::ConstantFP::getNegativeZero(Ty->LLVMTy);127return cast<Constant>(Ty->getContext().getOrCreateConstant(LLVMC));128}129Constant *ConstantFP::getInfinity(Type *Ty, bool Negative) {130auto *LLVMC = llvm::ConstantFP::getInfinity(Ty->LLVMTy, Negative);131return cast<Constant>(Ty->getContext().getOrCreateConstant(LLVMC));132}133bool ConstantFP::isValueValidForType(Type *Ty, const APFloat &V) {134return llvm::ConstantFP::isValueValidForType(Ty->LLVMTy, V);135}136137Constant *ConstantArray::get(ArrayType *T, ArrayRef<Constant *> V) {138auto &Ctx = T->getContext();139SmallVector<llvm::Constant *> LLVMValues;140LLVMValues.reserve(V.size());141for (auto *Elm : V)142LLVMValues.push_back(cast<llvm::Constant>(Elm->Val));143auto *LLVMC =144llvm::ConstantArray::get(cast<llvm::ArrayType>(T->LLVMTy), LLVMValues);145return cast<ConstantArray>(Ctx.getOrCreateConstant(LLVMC));146}147148ArrayType *ConstantArray::getType() const {149return cast<ArrayType>(150Ctx.getType(cast<llvm::ConstantArray>(Val)->getType()));151}152153Constant *ConstantStruct::get(StructType *T, ArrayRef<Constant *> V) {154auto &Ctx = T->getContext();155SmallVector<llvm::Constant *> LLVMValues;156LLVMValues.reserve(V.size());157for (auto *Elm : V)158LLVMValues.push_back(cast<llvm::Constant>(Elm->Val));159auto *LLVMC =160llvm::ConstantStruct::get(cast<llvm::StructType>(T->LLVMTy), LLVMValues);161return cast<ConstantStruct>(Ctx.getOrCreateConstant(LLVMC));162}163164StructType *ConstantStruct::getTypeForElements(Context &Ctx,165ArrayRef<Constant *> V,166bool Packed) {167unsigned VecSize = V.size();168SmallVector<Type *, 16> EltTypes;169EltTypes.reserve(VecSize);170for (Constant *Elm : V)171EltTypes.push_back(Elm->getType());172return StructType::get(Ctx, EltTypes, Packed);173}174175Constant *ConstantVector::get(ArrayRef<Constant *> V) {176assert(!V.empty() && "Expected non-empty V!");177auto &Ctx = V[0]->getContext();178SmallVector<llvm::Constant *, 8> LLVMV;179LLVMV.reserve(V.size());180for (auto *Elm : V)181LLVMV.push_back(cast<llvm::Constant>(Elm->Val));182return Ctx.getOrCreateConstant(llvm::ConstantVector::get(LLVMV));183}184185Constant *ConstantVector::getSplat(ElementCount EC, Constant *Elt) {186auto *LLVMElt = cast<llvm::Constant>(Elt->Val);187auto &Ctx = Elt->getContext();188return Ctx.getOrCreateConstant(llvm::ConstantVector::getSplat(EC, LLVMElt));189}190191Constant *ConstantVector::getSplatValue(bool AllowPoison) const {192auto *LLVMSplatValue = cast_or_null<llvm::Constant>(193cast<llvm::ConstantVector>(Val)->getSplatValue(AllowPoison));194return LLVMSplatValue ? Ctx.getOrCreateConstant(LLVMSplatValue) : nullptr;195}196197ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) {198auto *LLVMC = llvm::ConstantAggregateZero::get(Ty->LLVMTy);199return cast<ConstantAggregateZero>(200Ty->getContext().getOrCreateConstant(LLVMC));201}202203Constant *ConstantAggregateZero::getSequentialElement() const {204return cast<Constant>(Ctx.getValue(205cast<llvm::ConstantAggregateZero>(Val)->getSequentialElement()));206}207Constant *ConstantAggregateZero::getStructElement(unsigned Elt) const {208return cast<Constant>(Ctx.getValue(209cast<llvm::ConstantAggregateZero>(Val)->getStructElement(Elt)));210}211Constant *ConstantAggregateZero::getElementValue(Constant *C) const {212return cast<Constant>(213Ctx.getValue(cast<llvm::ConstantAggregateZero>(Val)->getElementValue(214cast<llvm::Constant>(C->Val))));215}216Constant *ConstantAggregateZero::getElementValue(unsigned Idx) const {217return cast<Constant>(Ctx.getValue(218cast<llvm::ConstantAggregateZero>(Val)->getElementValue(Idx)));219}220221ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) {222auto *LLVMC =223llvm::ConstantPointerNull::get(cast<llvm::PointerType>(Ty->LLVMTy));224return cast<ConstantPointerNull>(Ty->getContext().getOrCreateConstant(LLVMC));225}226227PointerType *ConstantPointerNull::getType() const {228return cast<PointerType>(229Ctx.getType(cast<llvm::ConstantPointerNull>(Val)->getType()));230}231232UndefValue *UndefValue::get(Type *T) {233auto *LLVMC = llvm::UndefValue::get(T->LLVMTy);234return cast<UndefValue>(T->getContext().getOrCreateConstant(LLVMC));235}236237UndefValue *UndefValue::getSequentialElement() const {238return cast<UndefValue>(Ctx.getOrCreateConstant(239cast<llvm::UndefValue>(Val)->getSequentialElement()));240}241242UndefValue *UndefValue::getStructElement(unsigned Elt) const {243return cast<UndefValue>(Ctx.getOrCreateConstant(244cast<llvm::UndefValue>(Val)->getStructElement(Elt)));245}246247UndefValue *UndefValue::getElementValue(Constant *C) const {248return cast<UndefValue>(249Ctx.getOrCreateConstant(cast<llvm::UndefValue>(Val)->getElementValue(250cast<llvm::Constant>(C->Val))));251}252253UndefValue *UndefValue::getElementValue(unsigned Idx) const {254return cast<UndefValue>(Ctx.getOrCreateConstant(255cast<llvm::UndefValue>(Val)->getElementValue(Idx)));256}257258PoisonValue *PoisonValue::get(Type *T) {259auto *LLVMC = llvm::PoisonValue::get(T->LLVMTy);260return cast<PoisonValue>(T->getContext().getOrCreateConstant(LLVMC));261}262263PoisonValue *PoisonValue::getSequentialElement() const {264return cast<PoisonValue>(Ctx.getOrCreateConstant(265cast<llvm::PoisonValue>(Val)->getSequentialElement()));266}267268PoisonValue *PoisonValue::getStructElement(unsigned Elt) const {269return cast<PoisonValue>(Ctx.getOrCreateConstant(270cast<llvm::PoisonValue>(Val)->getStructElement(Elt)));271}272273PoisonValue *PoisonValue::getElementValue(Constant *C) const {274return cast<PoisonValue>(275Ctx.getOrCreateConstant(cast<llvm::PoisonValue>(Val)->getElementValue(276cast<llvm::Constant>(C->Val))));277}278279PoisonValue *PoisonValue::getElementValue(unsigned Idx) const {280return cast<PoisonValue>(Ctx.getOrCreateConstant(281cast<llvm::PoisonValue>(Val)->getElementValue(Idx)));282}283284void GlobalVariable::setAlignment(MaybeAlign Align) {285Ctx.getTracker()286.emplaceIfTracking<GenericSetter<&GlobalVariable::getAlign,287&GlobalVariable::setAlignment>>(this);288cast<llvm::GlobalVariable>(Val)->setAlignment(Align);289}290291void GlobalObject::setSection(StringRef S) {292Ctx.getTracker()293.emplaceIfTracking<294GenericSetter<&GlobalObject::getSection, &GlobalObject::setSection>>(295this);296cast<llvm::GlobalObject>(Val)->setSection(S);297}298299template <typename GlobalT, typename LLVMGlobalT, typename ParentT,300typename LLVMParentT>301GlobalT &GlobalWithNodeAPI<GlobalT, LLVMGlobalT, ParentT, LLVMParentT>::302LLVMGVToGV::operator()(LLVMGlobalT &LLVMGV) const {303return cast<GlobalT>(*Ctx.getValue(&LLVMGV));304}305306// Explicit instantiations.307template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI<308GlobalIFunc, llvm::GlobalIFunc, GlobalObject, llvm::GlobalObject>;309template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI<310Function, llvm::Function, GlobalObject, llvm::GlobalObject>;311template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI<312GlobalVariable, llvm::GlobalVariable, GlobalObject, llvm::GlobalObject>;313template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI<314GlobalAlias, llvm::GlobalAlias, GlobalValue, llvm::GlobalValue>;315316void GlobalIFunc::setResolver(Constant *Resolver) {317Ctx.getTracker()318.emplaceIfTracking<319GenericSetter<&GlobalIFunc::getResolver, &GlobalIFunc::setResolver>>(320this);321cast<llvm::GlobalIFunc>(Val)->setResolver(322cast<llvm::Constant>(Resolver->Val));323}324325Constant *GlobalIFunc::getResolver() const {326return Ctx.getOrCreateConstant(cast<llvm::GlobalIFunc>(Val)->getResolver());327}328329Function *GlobalIFunc::getResolverFunction() {330return cast<Function>(Ctx.getOrCreateConstant(331cast<llvm::GlobalIFunc>(Val)->getResolverFunction()));332}333334GlobalVariable &335GlobalVariable::LLVMGVToGV::operator()(llvm::GlobalVariable &LLVMGV) const {336return cast<GlobalVariable>(*Ctx.getValue(&LLVMGV));337}338339Constant *GlobalVariable::getInitializer() const {340return Ctx.getOrCreateConstant(341cast<llvm::GlobalVariable>(Val)->getInitializer());342}343344void GlobalVariable::setInitializer(Constant *InitVal) {345Ctx.getTracker()346.emplaceIfTracking<GenericSetter<&GlobalVariable::getInitializer,347&GlobalVariable::setInitializer>>(this);348cast<llvm::GlobalVariable>(Val)->setInitializer(349cast<llvm::Constant>(InitVal->Val));350}351352void GlobalVariable::setConstant(bool V) {353Ctx.getTracker()354.emplaceIfTracking<GenericSetter<&GlobalVariable::isConstant,355&GlobalVariable::setConstant>>(this);356cast<llvm::GlobalVariable>(Val)->setConstant(V);357}358359void GlobalVariable::setExternallyInitialized(bool V) {360Ctx.getTracker()361.emplaceIfTracking<362GenericSetter<&GlobalVariable::isExternallyInitialized,363&GlobalVariable::setExternallyInitialized>>(this);364cast<llvm::GlobalVariable>(Val)->setExternallyInitialized(V);365}366367void GlobalAlias::setAliasee(Constant *Aliasee) {368Ctx.getTracker()369.emplaceIfTracking<370GenericSetter<&GlobalAlias::getAliasee, &GlobalAlias::setAliasee>>(371this);372cast<llvm::GlobalAlias>(Val)->setAliasee(cast<llvm::Constant>(Aliasee->Val));373}374375Constant *GlobalAlias::getAliasee() const {376return cast<Constant>(377Ctx.getOrCreateConstant(cast<llvm::GlobalAlias>(Val)->getAliasee()));378}379380const GlobalObject *GlobalAlias::getAliaseeObject() const {381return cast<GlobalObject>(Ctx.getOrCreateConstant(382cast<llvm::GlobalAlias>(Val)->getAliaseeObject()));383}384385void GlobalValue::setUnnamedAddr(UnnamedAddr V) {386Ctx.getTracker()387.emplaceIfTracking<GenericSetter<&GlobalValue::getUnnamedAddr,388&GlobalValue::setUnnamedAddr>>(this);389cast<llvm::GlobalValue>(Val)->setUnnamedAddr(V);390}391392void GlobalValue::setVisibility(VisibilityTypes V) {393Ctx.getTracker()394.emplaceIfTracking<GenericSetter<&GlobalValue::getVisibility,395&GlobalValue::setVisibility>>(this);396cast<llvm::GlobalValue>(Val)->setVisibility(V);397}398399NoCFIValue *NoCFIValue::get(GlobalValue *GV) {400auto *LLVMC = llvm::NoCFIValue::get(cast<llvm::GlobalValue>(GV->Val));401return cast<NoCFIValue>(GV->getContext().getOrCreateConstant(LLVMC));402}403404GlobalValue *NoCFIValue::getGlobalValue() const {405auto *LLVMC = cast<llvm::NoCFIValue>(Val)->getGlobalValue();406return cast<GlobalValue>(Ctx.getOrCreateConstant(LLVMC));407}408409PointerType *NoCFIValue::getType() const {410return cast<PointerType>(Ctx.getType(cast<llvm::NoCFIValue>(Val)->getType()));411}412413ConstantPtrAuth *ConstantPtrAuth::get(Constant *Ptr, ConstantInt *Key,414ConstantInt *Disc, Constant *AddrDisc) {415auto *LLVMC = llvm::ConstantPtrAuth::get(416cast<llvm::Constant>(Ptr->Val), cast<llvm::ConstantInt>(Key->Val),417cast<llvm::ConstantInt>(Disc->Val), cast<llvm::Constant>(AddrDisc->Val));418return cast<ConstantPtrAuth>(Ptr->getContext().getOrCreateConstant(LLVMC));419}420421Constant *ConstantPtrAuth::getPointer() const {422return Ctx.getOrCreateConstant(423cast<llvm::ConstantPtrAuth>(Val)->getPointer());424}425426ConstantInt *ConstantPtrAuth::getKey() const {427return cast<ConstantInt>(428Ctx.getOrCreateConstant(cast<llvm::ConstantPtrAuth>(Val)->getKey()));429}430431ConstantInt *ConstantPtrAuth::getDiscriminator() const {432return cast<ConstantInt>(Ctx.getOrCreateConstant(433cast<llvm::ConstantPtrAuth>(Val)->getDiscriminator()));434}435436Constant *ConstantPtrAuth::getAddrDiscriminator() const {437return Ctx.getOrCreateConstant(438cast<llvm::ConstantPtrAuth>(Val)->getAddrDiscriminator());439}440441ConstantPtrAuth *ConstantPtrAuth::getWithSameSchema(Constant *Pointer) const {442auto *LLVMC = cast<llvm::ConstantPtrAuth>(Val)->getWithSameSchema(443cast<llvm::Constant>(Pointer->Val));444return cast<ConstantPtrAuth>(Ctx.getOrCreateConstant(LLVMC));445}446447BlockAddress *BlockAddress::get(Function *F, BasicBlock *BB) {448auto *LLVMC = llvm::BlockAddress::get(cast<llvm::Function>(F->Val),449cast<llvm::BasicBlock>(BB->Val));450return cast<BlockAddress>(F->getContext().getOrCreateConstant(LLVMC));451}452453BlockAddress *BlockAddress::get(BasicBlock *BB) {454auto *LLVMC = llvm::BlockAddress::get(cast<llvm::BasicBlock>(BB->Val));455return cast<BlockAddress>(BB->getContext().getOrCreateConstant(LLVMC));456}457458BlockAddress *BlockAddress::lookup(const BasicBlock *BB) {459auto *LLVMC = llvm::BlockAddress::lookup(cast<llvm::BasicBlock>(BB->Val));460return cast_or_null<BlockAddress>(BB->getContext().getValue(LLVMC));461}462463Function *BlockAddress::getFunction() const {464return cast<Function>(465Ctx.getValue(cast<llvm::BlockAddress>(Val)->getFunction()));466}467468BasicBlock *BlockAddress::getBasicBlock() const {469return cast<BasicBlock>(470Ctx.getValue(cast<llvm::BlockAddress>(Val)->getBasicBlock()));471}472473DSOLocalEquivalent *DSOLocalEquivalent::get(GlobalValue *GV) {474auto *LLVMC = llvm::DSOLocalEquivalent::get(cast<llvm::GlobalValue>(GV->Val));475return cast<DSOLocalEquivalent>(GV->getContext().getValue(LLVMC));476}477478GlobalValue *DSOLocalEquivalent::getGlobalValue() const {479return cast<GlobalValue>(480Ctx.getValue(cast<llvm::DSOLocalEquivalent>(Val)->getGlobalValue()));481}482483} // namespace llvm::sandboxir484485486