| 1 | //===- Constant.cpp - The Constant classes of Sandbox IR ------------------===// |
| 2 | // |
| 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| 4 | // See https://llvm.org/LICENSE.txt for license information. |
| 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | |
| 9 | #include "llvm/SandboxIR/Constant.h" |
| 10 | #include "llvm/SandboxIR/BasicBlock.h" |
| 11 | #include "llvm/SandboxIR/Context.h" |
| 12 | #include "llvm/SandboxIR/Function.h" |
| 13 | #include "llvm/Support/Compiler.h" |
| 14 | |
| 15 | namespace llvm::sandboxir { |
| 16 | |
| 17 | #ifndef NDEBUG |
| 18 | void Constant::dumpOS(raw_ostream &OS) const { |
| 19 | dumpCommonPrefix(OS); |
| 20 | dumpCommonSuffix(OS); |
| 21 | } |
| 22 | #endif // NDEBUG |
| 23 | |
| 24 | ConstantInt *ConstantInt::getTrue(Context &Ctx) { |
| 25 | auto *LLVMC = llvm::ConstantInt::getTrue(Context&: Ctx.LLVMCtx); |
| 26 | return cast<ConstantInt>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 27 | } |
| 28 | ConstantInt *ConstantInt::getFalse(Context &Ctx) { |
| 29 | auto *LLVMC = llvm::ConstantInt::getFalse(Context&: Ctx.LLVMCtx); |
| 30 | return cast<ConstantInt>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 31 | } |
| 32 | ConstantInt *ConstantInt::getBool(Context &Ctx, bool V) { |
| 33 | auto *LLVMC = llvm::ConstantInt::getBool(Context&: Ctx.LLVMCtx, V); |
| 34 | return cast<ConstantInt>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 35 | } |
| 36 | Constant *ConstantInt::getTrue(Type *Ty) { |
| 37 | auto *LLVMC = llvm::ConstantInt::getTrue(Ty: Ty->LLVMTy); |
| 38 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 39 | } |
| 40 | Constant *ConstantInt::getFalse(Type *Ty) { |
| 41 | auto *LLVMC = llvm::ConstantInt::getFalse(Ty: Ty->LLVMTy); |
| 42 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 43 | } |
| 44 | Constant *ConstantInt::getBool(Type *Ty, bool V) { |
| 45 | auto *LLVMC = llvm::ConstantInt::getBool(Ty: Ty->LLVMTy, V); |
| 46 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 47 | } |
| 48 | ConstantInt *ConstantInt::get(Type *Ty, uint64_t V, bool IsSigned) { |
| 49 | auto *LLVMC = llvm::ConstantInt::get(Ty: Ty->LLVMTy, V, IsSigned); |
| 50 | return cast<ConstantInt>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 51 | } |
| 52 | ConstantInt *ConstantInt::get(IntegerType *Ty, uint64_t V, bool IsSigned) { |
| 53 | auto *LLVMC = llvm::ConstantInt::get(Ty: Ty->LLVMTy, V, IsSigned); |
| 54 | return cast<ConstantInt>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 55 | } |
| 56 | ConstantInt *ConstantInt::getSigned(IntegerType *Ty, int64_t V) { |
| 57 | auto *LLVMC = |
| 58 | llvm::ConstantInt::getSigned(Ty: cast<llvm::IntegerType>(Val: Ty->LLVMTy), V); |
| 59 | return cast<ConstantInt>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 60 | } |
| 61 | Constant *ConstantInt::getSigned(Type *Ty, int64_t V) { |
| 62 | auto *LLVMC = llvm::ConstantInt::getSigned(Ty: Ty->LLVMTy, V); |
| 63 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 64 | } |
| 65 | ConstantInt *ConstantInt::get(Context &Ctx, const APInt &V) { |
| 66 | auto *LLVMC = llvm::ConstantInt::get(Context&: Ctx.LLVMCtx, V); |
| 67 | return cast<ConstantInt>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 68 | } |
| 69 | ConstantInt *ConstantInt::get(IntegerType *Ty, StringRef Str, uint8_t Radix) { |
| 70 | auto *LLVMC = |
| 71 | llvm::ConstantInt::get(Ty: cast<llvm::IntegerType>(Val: Ty->LLVMTy), Str, Radix); |
| 72 | return cast<ConstantInt>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 73 | } |
| 74 | Constant *ConstantInt::get(Type *Ty, const APInt &V) { |
| 75 | auto *LLVMC = llvm::ConstantInt::get(Ty: Ty->LLVMTy, V); |
| 76 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 77 | } |
| 78 | IntegerType *ConstantInt::getIntegerType() const { |
| 79 | auto *LLVMTy = cast<llvm::ConstantInt>(Val)->getIntegerType(); |
| 80 | return cast<IntegerType>(Val: Ctx.getType(LLVMTy)); |
| 81 | } |
| 82 | |
| 83 | bool ConstantInt::isValueValidForType(Type *Ty, uint64_t V) { |
| 84 | return llvm::ConstantInt::isValueValidForType(Ty: Ty->LLVMTy, V); |
| 85 | } |
| 86 | bool ConstantInt::isValueValidForType(Type *Ty, int64_t V) { |
| 87 | return llvm::ConstantInt::isValueValidForType(Ty: Ty->LLVMTy, V); |
| 88 | } |
| 89 | |
| 90 | Constant *ConstantFP::get(Type *Ty, double V) { |
| 91 | auto *LLVMC = llvm::ConstantFP::get(Ty: Ty->LLVMTy, V); |
| 92 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 93 | } |
| 94 | |
| 95 | Constant *ConstantFP::get(Type *Ty, const APFloat &V) { |
| 96 | auto *LLVMC = llvm::ConstantFP::get(Ty: Ty->LLVMTy, V); |
| 97 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 98 | } |
| 99 | |
| 100 | Constant *ConstantFP::get(Type *Ty, StringRef Str) { |
| 101 | auto *LLVMC = llvm::ConstantFP::get(Ty: Ty->LLVMTy, Str); |
| 102 | return Ty->getContext().getOrCreateConstant(LLVMC); |
| 103 | } |
| 104 | |
| 105 | ConstantFP *ConstantFP::get(const APFloat &V, Context &Ctx) { |
| 106 | auto *LLVMC = llvm::ConstantFP::get(Context&: Ctx.LLVMCtx, V); |
| 107 | return cast<ConstantFP>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 108 | } |
| 109 | |
| 110 | Constant *ConstantFP::getNaN(Type *Ty, bool Negative, uint64_t Payload) { |
| 111 | auto *LLVMC = llvm::ConstantFP::getNaN(Ty: Ty->LLVMTy, Negative, Payload); |
| 112 | return cast<Constant>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 113 | } |
| 114 | Constant *ConstantFP::getQNaN(Type *Ty, bool Negative, APInt *Payload) { |
| 115 | auto *LLVMC = llvm::ConstantFP::getQNaN(Ty: Ty->LLVMTy, Negative, Payload); |
| 116 | return cast<Constant>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 117 | } |
| 118 | Constant *ConstantFP::getSNaN(Type *Ty, bool Negative, APInt *Payload) { |
| 119 | auto *LLVMC = llvm::ConstantFP::getSNaN(Ty: Ty->LLVMTy, Negative, Payload); |
| 120 | return cast<Constant>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 121 | } |
| 122 | Constant *ConstantFP::getZero(Type *Ty, bool Negative) { |
| 123 | auto *LLVMC = llvm::ConstantFP::getZero(Ty: Ty->LLVMTy, Negative); |
| 124 | return cast<Constant>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 125 | } |
| 126 | Constant *ConstantFP::getNegativeZero(Type *Ty) { |
| 127 | auto *LLVMC = llvm::ConstantFP::getNegativeZero(Ty: Ty->LLVMTy); |
| 128 | return cast<Constant>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 129 | } |
| 130 | Constant *ConstantFP::getInfinity(Type *Ty, bool Negative) { |
| 131 | auto *LLVMC = llvm::ConstantFP::getInfinity(Ty: Ty->LLVMTy, Negative); |
| 132 | return cast<Constant>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 133 | } |
| 134 | bool ConstantFP::isValueValidForType(Type *Ty, const APFloat &V) { |
| 135 | return llvm::ConstantFP::isValueValidForType(Ty: Ty->LLVMTy, V); |
| 136 | } |
| 137 | |
| 138 | Constant *ConstantArray::get(ArrayType *T, ArrayRef<Constant *> V) { |
| 139 | auto &Ctx = T->getContext(); |
| 140 | SmallVector<llvm::Constant *> LLVMValues; |
| 141 | LLVMValues.reserve(N: V.size()); |
| 142 | for (auto *Elm : V) |
| 143 | LLVMValues.push_back(Elt: cast<llvm::Constant>(Val: Elm->Val)); |
| 144 | auto *LLVMC = |
| 145 | llvm::ConstantArray::get(T: cast<llvm::ArrayType>(Val: T->LLVMTy), V: LLVMValues); |
| 146 | return cast<ConstantArray>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 147 | } |
| 148 | |
| 149 | ArrayType *ConstantArray::getType() const { |
| 150 | return cast<ArrayType>( |
| 151 | Val: Ctx.getType(LLVMTy: cast<llvm::ConstantArray>(Val)->getType())); |
| 152 | } |
| 153 | |
| 154 | Constant *ConstantStruct::get(StructType *T, ArrayRef<Constant *> V) { |
| 155 | auto &Ctx = T->getContext(); |
| 156 | SmallVector<llvm::Constant *> LLVMValues; |
| 157 | LLVMValues.reserve(N: V.size()); |
| 158 | for (auto *Elm : V) |
| 159 | LLVMValues.push_back(Elt: cast<llvm::Constant>(Val: Elm->Val)); |
| 160 | auto *LLVMC = |
| 161 | llvm::ConstantStruct::get(T: cast<llvm::StructType>(Val: T->LLVMTy), V: LLVMValues); |
| 162 | return cast<ConstantStruct>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 163 | } |
| 164 | |
| 165 | StructType *ConstantStruct::getTypeForElements(Context &Ctx, |
| 166 | ArrayRef<Constant *> V, |
| 167 | bool Packed) { |
| 168 | unsigned VecSize = V.size(); |
| 169 | SmallVector<Type *, 16> EltTypes; |
| 170 | EltTypes.reserve(N: VecSize); |
| 171 | for (Constant *Elm : V) |
| 172 | EltTypes.push_back(Elt: Elm->getType()); |
| 173 | return StructType::get(Ctx, Elements: EltTypes, IsPacked: Packed); |
| 174 | } |
| 175 | |
| 176 | Constant *ConstantVector::get(ArrayRef<Constant *> V) { |
| 177 | assert(!V.empty() && "Expected non-empty V!" ); |
| 178 | auto &Ctx = V[0]->getContext(); |
| 179 | SmallVector<llvm::Constant *, 8> LLVMV; |
| 180 | LLVMV.reserve(N: V.size()); |
| 181 | for (auto *Elm : V) |
| 182 | LLVMV.push_back(Elt: cast<llvm::Constant>(Val: Elm->Val)); |
| 183 | return Ctx.getOrCreateConstant(LLVMC: llvm::ConstantVector::get(V: LLVMV)); |
| 184 | } |
| 185 | |
| 186 | Constant *ConstantVector::getSplat(ElementCount EC, Constant *Elt) { |
| 187 | auto *LLVMElt = cast<llvm::Constant>(Val: Elt->Val); |
| 188 | auto &Ctx = Elt->getContext(); |
| 189 | return Ctx.getOrCreateConstant(LLVMC: llvm::ConstantVector::getSplat(EC, Elt: LLVMElt)); |
| 190 | } |
| 191 | |
| 192 | Constant *ConstantVector::getSplatValue(bool AllowPoison) const { |
| 193 | auto *LLVMSplatValue = cast_or_null<llvm::Constant>( |
| 194 | Val: cast<llvm::ConstantVector>(Val)->getSplatValue(AllowPoison)); |
| 195 | return LLVMSplatValue ? Ctx.getOrCreateConstant(LLVMC: LLVMSplatValue) : nullptr; |
| 196 | } |
| 197 | |
| 198 | ConstantAggregateZero *ConstantAggregateZero::get(Type *Ty) { |
| 199 | auto *LLVMC = llvm::ConstantAggregateZero::get(Ty: Ty->LLVMTy); |
| 200 | return cast<ConstantAggregateZero>( |
| 201 | Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 202 | } |
| 203 | |
| 204 | Constant *ConstantAggregateZero::getSequentialElement() const { |
| 205 | return cast<Constant>(Val: Ctx.getValue( |
| 206 | V: cast<llvm::ConstantAggregateZero>(Val)->getSequentialElement())); |
| 207 | } |
| 208 | Constant *ConstantAggregateZero::getStructElement(unsigned Elt) const { |
| 209 | return cast<Constant>(Val: Ctx.getValue( |
| 210 | V: cast<llvm::ConstantAggregateZero>(Val)->getStructElement(Elt))); |
| 211 | } |
| 212 | Constant *ConstantAggregateZero::getElementValue(Constant *C) const { |
| 213 | return cast<Constant>( |
| 214 | Val: Ctx.getValue(V: cast<llvm::ConstantAggregateZero>(Val)->getElementValue( |
| 215 | C: cast<llvm::Constant>(Val: C->Val)))); |
| 216 | } |
| 217 | Constant *ConstantAggregateZero::getElementValue(unsigned Idx) const { |
| 218 | return cast<Constant>(Val: Ctx.getValue( |
| 219 | V: cast<llvm::ConstantAggregateZero>(Val)->getElementValue(Idx))); |
| 220 | } |
| 221 | |
| 222 | ConstantPointerNull *ConstantPointerNull::get(PointerType *Ty) { |
| 223 | auto *LLVMC = |
| 224 | llvm::ConstantPointerNull::get(T: cast<llvm::PointerType>(Val: Ty->LLVMTy)); |
| 225 | return cast<ConstantPointerNull>(Val: Ty->getContext().getOrCreateConstant(LLVMC)); |
| 226 | } |
| 227 | |
| 228 | PointerType *ConstantPointerNull::getType() const { |
| 229 | return cast<PointerType>( |
| 230 | Val: Ctx.getType(LLVMTy: cast<llvm::ConstantPointerNull>(Val)->getType())); |
| 231 | } |
| 232 | |
| 233 | UndefValue *UndefValue::get(Type *T) { |
| 234 | auto *LLVMC = llvm::UndefValue::get(T: T->LLVMTy); |
| 235 | return cast<UndefValue>(Val: T->getContext().getOrCreateConstant(LLVMC)); |
| 236 | } |
| 237 | |
| 238 | UndefValue *UndefValue::getSequentialElement() const { |
| 239 | return cast<UndefValue>(Val: Ctx.getOrCreateConstant( |
| 240 | LLVMC: cast<llvm::UndefValue>(Val)->getSequentialElement())); |
| 241 | } |
| 242 | |
| 243 | UndefValue *UndefValue::getStructElement(unsigned Elt) const { |
| 244 | return cast<UndefValue>(Val: Ctx.getOrCreateConstant( |
| 245 | LLVMC: cast<llvm::UndefValue>(Val)->getStructElement(Elt))); |
| 246 | } |
| 247 | |
| 248 | UndefValue *UndefValue::getElementValue(Constant *C) const { |
| 249 | return cast<UndefValue>( |
| 250 | Val: Ctx.getOrCreateConstant(LLVMC: cast<llvm::UndefValue>(Val)->getElementValue( |
| 251 | C: cast<llvm::Constant>(Val: C->Val)))); |
| 252 | } |
| 253 | |
| 254 | UndefValue *UndefValue::getElementValue(unsigned Idx) const { |
| 255 | return cast<UndefValue>(Val: Ctx.getOrCreateConstant( |
| 256 | LLVMC: cast<llvm::UndefValue>(Val)->getElementValue(Idx))); |
| 257 | } |
| 258 | |
| 259 | PoisonValue *PoisonValue::get(Type *T) { |
| 260 | auto *LLVMC = llvm::PoisonValue::get(T: T->LLVMTy); |
| 261 | return cast<PoisonValue>(Val: T->getContext().getOrCreateConstant(LLVMC)); |
| 262 | } |
| 263 | |
| 264 | PoisonValue *PoisonValue::getSequentialElement() const { |
| 265 | return cast<PoisonValue>(Val: Ctx.getOrCreateConstant( |
| 266 | LLVMC: cast<llvm::PoisonValue>(Val)->getSequentialElement())); |
| 267 | } |
| 268 | |
| 269 | PoisonValue *PoisonValue::getStructElement(unsigned Elt) const { |
| 270 | return cast<PoisonValue>(Val: Ctx.getOrCreateConstant( |
| 271 | LLVMC: cast<llvm::PoisonValue>(Val)->getStructElement(Elt))); |
| 272 | } |
| 273 | |
| 274 | PoisonValue *PoisonValue::getElementValue(Constant *C) const { |
| 275 | return cast<PoisonValue>( |
| 276 | Val: Ctx.getOrCreateConstant(LLVMC: cast<llvm::PoisonValue>(Val)->getElementValue( |
| 277 | C: cast<llvm::Constant>(Val: C->Val)))); |
| 278 | } |
| 279 | |
| 280 | PoisonValue *PoisonValue::getElementValue(unsigned Idx) const { |
| 281 | return cast<PoisonValue>(Val: Ctx.getOrCreateConstant( |
| 282 | LLVMC: cast<llvm::PoisonValue>(Val)->getElementValue(Idx))); |
| 283 | } |
| 284 | |
| 285 | void GlobalVariable::setAlignment(MaybeAlign Align) { |
| 286 | Ctx.getTracker() |
| 287 | .emplaceIfTracking<GenericSetter<&GlobalVariable::getAlign, |
| 288 | &GlobalVariable::setAlignment>>(Args: this); |
| 289 | cast<llvm::GlobalVariable>(Val)->setAlignment(Align); |
| 290 | } |
| 291 | |
| 292 | void GlobalObject::setSection(StringRef S) { |
| 293 | Ctx.getTracker() |
| 294 | .emplaceIfTracking< |
| 295 | GenericSetter<&GlobalObject::getSection, &GlobalObject::setSection>>( |
| 296 | Args: this); |
| 297 | cast<llvm::GlobalObject>(Val)->setSection(S); |
| 298 | } |
| 299 | |
| 300 | template <typename GlobalT, typename LLVMGlobalT, typename ParentT, |
| 301 | typename LLVMParentT> |
| 302 | GlobalT &GlobalWithNodeAPI<GlobalT, LLVMGlobalT, ParentT, LLVMParentT>:: |
| 303 | LLVMGVToGV::operator()(LLVMGlobalT &LLVMGV) const { |
| 304 | return cast<GlobalT>(*Ctx.getValue(&LLVMGV)); |
| 305 | } |
| 306 | |
| 307 | // Explicit instantiations. |
| 308 | template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI< |
| 309 | GlobalIFunc, llvm::GlobalIFunc, GlobalObject, llvm::GlobalObject>; |
| 310 | template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI< |
| 311 | Function, llvm::Function, GlobalObject, llvm::GlobalObject>; |
| 312 | template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI< |
| 313 | GlobalVariable, llvm::GlobalVariable, GlobalObject, llvm::GlobalObject>; |
| 314 | template class LLVM_EXPORT_TEMPLATE GlobalWithNodeAPI< |
| 315 | GlobalAlias, llvm::GlobalAlias, GlobalValue, llvm::GlobalValue>; |
| 316 | |
| 317 | void GlobalIFunc::setResolver(Constant *Resolver) { |
| 318 | Ctx.getTracker() |
| 319 | .emplaceIfTracking< |
| 320 | GenericSetter<&GlobalIFunc::getResolver, &GlobalIFunc::setResolver>>( |
| 321 | Args: this); |
| 322 | cast<llvm::GlobalIFunc>(Val)->setResolver( |
| 323 | cast<llvm::Constant>(Val: Resolver->Val)); |
| 324 | } |
| 325 | |
| 326 | Constant *GlobalIFunc::getResolver() const { |
| 327 | return Ctx.getOrCreateConstant(LLVMC: cast<llvm::GlobalIFunc>(Val)->getResolver()); |
| 328 | } |
| 329 | |
| 330 | Function *GlobalIFunc::getResolverFunction() { |
| 331 | return cast<Function>(Val: Ctx.getOrCreateConstant( |
| 332 | LLVMC: cast<llvm::GlobalIFunc>(Val)->getResolverFunction())); |
| 333 | } |
| 334 | |
| 335 | GlobalVariable & |
| 336 | GlobalVariable::LLVMGVToGV::operator()(llvm::GlobalVariable &LLVMGV) const { |
| 337 | return cast<GlobalVariable>(Val&: *Ctx.getValue(V: &LLVMGV)); |
| 338 | } |
| 339 | |
| 340 | Constant *GlobalVariable::getInitializer() const { |
| 341 | return Ctx.getOrCreateConstant( |
| 342 | LLVMC: cast<llvm::GlobalVariable>(Val)->getInitializer()); |
| 343 | } |
| 344 | |
| 345 | void GlobalVariable::setInitializer(Constant *InitVal) { |
| 346 | Ctx.getTracker() |
| 347 | .emplaceIfTracking<GenericSetter<&GlobalVariable::getInitializer, |
| 348 | &GlobalVariable::setInitializer>>(Args: this); |
| 349 | cast<llvm::GlobalVariable>(Val)->setInitializer( |
| 350 | cast<llvm::Constant>(Val: InitVal->Val)); |
| 351 | } |
| 352 | |
| 353 | void GlobalVariable::setConstant(bool V) { |
| 354 | Ctx.getTracker() |
| 355 | .emplaceIfTracking<GenericSetter<&GlobalVariable::isConstant, |
| 356 | &GlobalVariable::setConstant>>(Args: this); |
| 357 | cast<llvm::GlobalVariable>(Val)->setConstant(V); |
| 358 | } |
| 359 | |
| 360 | void GlobalVariable::setExternallyInitialized(bool V) { |
| 361 | Ctx.getTracker() |
| 362 | .emplaceIfTracking< |
| 363 | GenericSetter<&GlobalVariable::isExternallyInitialized, |
| 364 | &GlobalVariable::setExternallyInitialized>>(Args: this); |
| 365 | cast<llvm::GlobalVariable>(Val)->setExternallyInitialized(V); |
| 366 | } |
| 367 | |
| 368 | void GlobalAlias::setAliasee(Constant *Aliasee) { |
| 369 | Ctx.getTracker() |
| 370 | .emplaceIfTracking< |
| 371 | GenericSetter<&GlobalAlias::getAliasee, &GlobalAlias::setAliasee>>( |
| 372 | Args: this); |
| 373 | cast<llvm::GlobalAlias>(Val)->setAliasee(cast<llvm::Constant>(Val: Aliasee->Val)); |
| 374 | } |
| 375 | |
| 376 | Constant *GlobalAlias::getAliasee() const { |
| 377 | return cast<Constant>( |
| 378 | Val: Ctx.getOrCreateConstant(LLVMC: cast<llvm::GlobalAlias>(Val)->getAliasee())); |
| 379 | } |
| 380 | |
| 381 | const GlobalObject *GlobalAlias::getAliaseeObject() const { |
| 382 | return cast<GlobalObject>(Val: Ctx.getOrCreateConstant( |
| 383 | LLVMC: cast<llvm::GlobalAlias>(Val)->getAliaseeObject())); |
| 384 | } |
| 385 | |
| 386 | void GlobalValue::setUnnamedAddr(UnnamedAddr V) { |
| 387 | Ctx.getTracker() |
| 388 | .emplaceIfTracking<GenericSetter<&GlobalValue::getUnnamedAddr, |
| 389 | &GlobalValue::setUnnamedAddr>>(Args: this); |
| 390 | cast<llvm::GlobalValue>(Val)->setUnnamedAddr(V); |
| 391 | } |
| 392 | |
| 393 | void GlobalValue::setVisibility(VisibilityTypes V) { |
| 394 | Ctx.getTracker() |
| 395 | .emplaceIfTracking<GenericSetter<&GlobalValue::getVisibility, |
| 396 | &GlobalValue::setVisibility>>(Args: this); |
| 397 | cast<llvm::GlobalValue>(Val)->setVisibility(V); |
| 398 | } |
| 399 | |
| 400 | NoCFIValue *NoCFIValue::get(GlobalValue *GV) { |
| 401 | auto *LLVMC = llvm::NoCFIValue::get(GV: cast<llvm::GlobalValue>(Val: GV->Val)); |
| 402 | return cast<NoCFIValue>(Val: GV->getContext().getOrCreateConstant(LLVMC)); |
| 403 | } |
| 404 | |
| 405 | GlobalValue *NoCFIValue::getGlobalValue() const { |
| 406 | auto *LLVMC = cast<llvm::NoCFIValue>(Val)->getGlobalValue(); |
| 407 | return cast<GlobalValue>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 408 | } |
| 409 | |
| 410 | PointerType *NoCFIValue::getType() const { |
| 411 | return cast<PointerType>(Val: Ctx.getType(LLVMTy: cast<llvm::NoCFIValue>(Val)->getType())); |
| 412 | } |
| 413 | |
| 414 | ConstantPtrAuth *ConstantPtrAuth::get(Constant *Ptr, ConstantInt *Key, |
| 415 | ConstantInt *Disc, Constant *AddrDisc) { |
| 416 | auto *LLVMC = llvm::ConstantPtrAuth::get( |
| 417 | Ptr: cast<llvm::Constant>(Val: Ptr->Val), Key: cast<llvm::ConstantInt>(Val: Key->Val), |
| 418 | Disc: cast<llvm::ConstantInt>(Val: Disc->Val), AddrDisc: cast<llvm::Constant>(Val: AddrDisc->Val)); |
| 419 | return cast<ConstantPtrAuth>(Val: Ptr->getContext().getOrCreateConstant(LLVMC)); |
| 420 | } |
| 421 | |
| 422 | Constant *ConstantPtrAuth::getPointer() const { |
| 423 | return Ctx.getOrCreateConstant( |
| 424 | LLVMC: cast<llvm::ConstantPtrAuth>(Val)->getPointer()); |
| 425 | } |
| 426 | |
| 427 | ConstantInt *ConstantPtrAuth::getKey() const { |
| 428 | return cast<ConstantInt>( |
| 429 | Val: Ctx.getOrCreateConstant(LLVMC: cast<llvm::ConstantPtrAuth>(Val)->getKey())); |
| 430 | } |
| 431 | |
| 432 | ConstantInt *ConstantPtrAuth::getDiscriminator() const { |
| 433 | return cast<ConstantInt>(Val: Ctx.getOrCreateConstant( |
| 434 | LLVMC: cast<llvm::ConstantPtrAuth>(Val)->getDiscriminator())); |
| 435 | } |
| 436 | |
| 437 | Constant *ConstantPtrAuth::getAddrDiscriminator() const { |
| 438 | return Ctx.getOrCreateConstant( |
| 439 | LLVMC: cast<llvm::ConstantPtrAuth>(Val)->getAddrDiscriminator()); |
| 440 | } |
| 441 | |
| 442 | ConstantPtrAuth *ConstantPtrAuth::getWithSameSchema(Constant *Pointer) const { |
| 443 | auto *LLVMC = cast<llvm::ConstantPtrAuth>(Val)->getWithSameSchema( |
| 444 | Pointer: cast<llvm::Constant>(Val: Pointer->Val)); |
| 445 | return cast<ConstantPtrAuth>(Val: Ctx.getOrCreateConstant(LLVMC)); |
| 446 | } |
| 447 | |
| 448 | BlockAddress *BlockAddress::get(Function *F, BasicBlock *BB) { |
| 449 | auto *LLVMC = llvm::BlockAddress::get(F: cast<llvm::Function>(Val: F->Val), |
| 450 | BB: cast<llvm::BasicBlock>(Val: BB->Val)); |
| 451 | return cast<BlockAddress>(Val: F->getContext().getOrCreateConstant(LLVMC)); |
| 452 | } |
| 453 | |
| 454 | BlockAddress *BlockAddress::get(BasicBlock *BB) { |
| 455 | auto *LLVMC = llvm::BlockAddress::get(BB: cast<llvm::BasicBlock>(Val: BB->Val)); |
| 456 | return cast<BlockAddress>(Val: BB->getContext().getOrCreateConstant(LLVMC)); |
| 457 | } |
| 458 | |
| 459 | BlockAddress *BlockAddress::lookup(const BasicBlock *BB) { |
| 460 | auto *LLVMC = llvm::BlockAddress::lookup(BB: cast<llvm::BasicBlock>(Val: BB->Val)); |
| 461 | return cast_or_null<BlockAddress>(Val: BB->getContext().getValue(V: LLVMC)); |
| 462 | } |
| 463 | |
| 464 | Function *BlockAddress::getFunction() const { |
| 465 | return cast<Function>( |
| 466 | Val: Ctx.getValue(V: cast<llvm::BlockAddress>(Val)->getFunction())); |
| 467 | } |
| 468 | |
| 469 | BasicBlock *BlockAddress::getBasicBlock() const { |
| 470 | return cast<BasicBlock>( |
| 471 | Val: Ctx.getValue(V: cast<llvm::BlockAddress>(Val)->getBasicBlock())); |
| 472 | } |
| 473 | |
| 474 | DSOLocalEquivalent *DSOLocalEquivalent::get(GlobalValue *GV) { |
| 475 | auto *LLVMC = llvm::DSOLocalEquivalent::get(GV: cast<llvm::GlobalValue>(Val: GV->Val)); |
| 476 | return cast<DSOLocalEquivalent>(Val: GV->getContext().getValue(V: LLVMC)); |
| 477 | } |
| 478 | |
| 479 | GlobalValue *DSOLocalEquivalent::getGlobalValue() const { |
| 480 | return cast<GlobalValue>( |
| 481 | Val: Ctx.getValue(V: cast<llvm::DSOLocalEquivalent>(Val)->getGlobalValue())); |
| 482 | } |
| 483 | |
| 484 | } // namespace llvm::sandboxir |
| 485 | |