@@ -2402,6 +2402,30 @@ StructType *ConstantStruct::getTypeForElements(Context &Ctx,
24022402 return StructType::get (Ctx, EltTypes, Packed);
24032403}
24042404
2405+ ConstantAggregateZero *ConstantAggregateZero::get (Type *Ty) {
2406+ auto *LLVMC = llvm::ConstantAggregateZero::get (Ty->LLVMTy );
2407+ return cast<ConstantAggregateZero>(
2408+ Ty->getContext ().getOrCreateConstant (LLVMC));
2409+ }
2410+
2411+ Constant *ConstantAggregateZero::getSequentialElement () const {
2412+ return cast<Constant>(Ctx.getValue (
2413+ cast<llvm::ConstantAggregateZero>(Val)->getSequentialElement ()));
2414+ }
2415+ Constant *ConstantAggregateZero::getStructElement (unsigned Elt) const {
2416+ return cast<Constant>(Ctx.getValue (
2417+ cast<llvm::ConstantAggregateZero>(Val)->getStructElement (Elt)));
2418+ }
2419+ Constant *ConstantAggregateZero::getElementValue (Constant *C) const {
2420+ return cast<Constant>(
2421+ Ctx.getValue (cast<llvm::ConstantAggregateZero>(Val)->getElementValue (
2422+ cast<llvm::Constant>(C->Val ))));
2423+ }
2424+ Constant *ConstantAggregateZero::getElementValue (unsigned Idx) const {
2425+ return cast<Constant>(Ctx.getValue (
2426+ cast<llvm::ConstantAggregateZero>(Val)->getElementValue (Idx)));
2427+ }
2428+
24052429FunctionType *Function::getFunctionType () const {
24062430 return cast<FunctionType>(
24072431 Ctx.getType (cast<llvm::Function>(Val)->getFunctionType ()));
@@ -2489,26 +2513,48 @@ Value *Context::getOrCreateValueInternal(llvm::Value *LLVMV, llvm::User *U) {
24892513 return It->second .get ();
24902514
24912515 if (auto *C = dyn_cast<llvm::Constant>(LLVMV)) {
2492- if (auto *CI = dyn_cast<llvm::ConstantInt>(C)) {
2493- It->second = std::unique_ptr<ConstantInt>(new ConstantInt (CI, *this ));
2516+ switch (C->getValueID ()) {
2517+ case llvm::Value::ConstantIntVal:
2518+ It->second = std::unique_ptr<ConstantInt>(
2519+ new ConstantInt (cast<llvm::ConstantInt>(C), *this ));
24942520 return It->second .get ();
2495- }
2496- if ( auto *CF = dyn_cast<llvm:: ConstantFP>(C)) {
2497- It-> second = std::unique_ptr< ConstantFP>(new ConstantFP (CF , *this ));
2521+ case llvm::Value::ConstantFPVal:
2522+ It-> second = std::unique_ptr< ConstantFP>(
2523+ new ConstantFP (cast<llvm:: ConstantFP>(C) , *this ));
24982524 return It->second .get ();
2525+ case llvm::Value::ConstantAggregateZeroVal: {
2526+ auto *CAZ = cast<llvm::ConstantAggregateZero>(C);
2527+ It->second = std::unique_ptr<ConstantAggregateZero>(
2528+ new ConstantAggregateZero (CAZ, *this ));
2529+ auto *Ret = It->second .get ();
2530+ // Must create sandboxir for elements.
2531+ auto EC = CAZ->getElementCount ();
2532+ if (EC.isFixed ()) {
2533+ for (auto ElmIdx : seq<unsigned >(0 , EC.getFixedValue ()))
2534+ getOrCreateValueInternal (CAZ->getElementValue (ElmIdx), CAZ);
2535+ }
2536+ return Ret;
24992537 }
2500- if (auto *CA = dyn_cast<llvm::ConstantArray>(C))
2501- It->second = std::unique_ptr<ConstantArray>(new ConstantArray (CA, *this ));
2502- else if (auto *CS = dyn_cast<llvm::ConstantStruct>(C))
2503- It->second =
2504- std::unique_ptr<ConstantStruct>(new ConstantStruct (CS, *this ));
2505- else if (auto *CV = dyn_cast<llvm::ConstantVector>(C))
2506- It->second =
2507- std::unique_ptr<ConstantVector>(new ConstantVector (CV, *this ));
2508- else if (auto *F = dyn_cast<llvm::Function>(LLVMV))
2509- It->second = std::unique_ptr<Function>(new Function (F, *this ));
2510- else
2538+ case llvm::Value::ConstantArrayVal:
2539+ It->second = std::unique_ptr<ConstantArray>(
2540+ new ConstantArray (cast<llvm::ConstantArray>(C), *this ));
2541+ break ;
2542+ case llvm::Value::ConstantStructVal:
2543+ It->second = std::unique_ptr<ConstantStruct>(
2544+ new ConstantStruct (cast<llvm::ConstantStruct>(C), *this ));
2545+ break ;
2546+ case llvm::Value::ConstantVectorVal:
2547+ It->second = std::unique_ptr<ConstantVector>(
2548+ new ConstantVector (cast<llvm::ConstantVector>(C), *this ));
2549+ break ;
2550+ case llvm::Value::FunctionVal:
2551+ It->second = std::unique_ptr<Function>(
2552+ new Function (cast<llvm::Function>(C), *this ));
2553+ break ;
2554+ default :
25112555 It->second = std::unique_ptr<Constant>(new Constant (C, *this ));
2556+ break ;
2557+ }
25122558 auto *NewC = It->second .get ();
25132559 for (llvm::Value *COp : C->operands ())
25142560 getOrCreateValueInternal (COp, C);
0 commit comments