| 4197 | } |
| 4198 | |
| 4199 | void updateGas() noexcept { |
| 4200 | if (LocalGas) { |
| 4201 | auto CurrBB = Builder.getInsertBlock(); |
| 4202 | auto CheckBB = LLVM::BasicBlock::create(LLContext, F.Fn, "gas_check"); |
| 4203 | auto OkBB = LLVM::BasicBlock::create(LLContext, F.Fn, "gas_ok"); |
| 4204 | auto EndBB = LLVM::BasicBlock::create(LLContext, F.Fn, "gas_end"); |
| 4205 | |
| 4206 | auto Cost = Builder.createLoad(Context.Int64Ty, LocalGas); |
| 4207 | Cost.setAlignment(64); |
| 4208 | auto GasPtr = Context.getGas(Builder, ExecCtx); |
| 4209 | auto GasLimit = Context.getGasLimit(Builder, ExecCtx); |
| 4210 | auto Gas = Builder.createLoad(Context.Int64Ty, GasPtr); |
| 4211 | Gas.setAlignment(64); |
| 4212 | Gas.setOrdering(LLVMAtomicOrderingMonotonic); |
| 4213 | Builder.createBr(CheckBB); |
| 4214 | Builder.positionAtEnd(CheckBB); |
| 4215 | |
| 4216 | auto PHIOldGas = Builder.createPHI(Context.Int64Ty); |
| 4217 | auto NewGas = Builder.createAdd(PHIOldGas, Cost); |
| 4218 | auto IsGasRemain = |
| 4219 | Builder.createLikely(Builder.createICmpULE(NewGas, GasLimit)); |
| 4220 | Builder.createCondBr(IsGasRemain, OkBB, |
| 4221 | getTrapBB(ErrCode::Value::CostLimitExceeded)); |
| 4222 | Builder.positionAtEnd(OkBB); |
| 4223 | |
| 4224 | auto RGasAndSucceed = Builder.createAtomicCmpXchg( |
| 4225 | GasPtr, PHIOldGas, NewGas, LLVMAtomicOrderingMonotonic, |
| 4226 | LLVMAtomicOrderingMonotonic); |
| 4227 | #if LLVM_VERSION_MAJOR >= 13 |
| 4228 | RGasAndSucceed.setAlignment(8); |
| 4229 | #endif |
| 4230 | RGasAndSucceed.setWeak(true); |
| 4231 | auto RGas = Builder.createExtractValue(RGasAndSucceed, 0); |
| 4232 | auto Succeed = Builder.createExtractValue(RGasAndSucceed, 1); |
| 4233 | Builder.createCondBr(Builder.createLikely(Succeed), EndBB, CheckBB); |
| 4234 | Builder.positionAtEnd(EndBB); |
| 4235 | |
| 4236 | Builder.createStore(LLContext.getInt64(0), LocalGas); |
| 4237 | |
| 4238 | PHIOldGas.addIncoming(Gas, CurrBB); |
| 4239 | PHIOldGas.addIncoming(RGas, OkBB); |
| 4240 | } |
| 4241 | } |
| 4242 | |
| 4243 | void updateGasAtTrap() noexcept { |
| 4244 | if (LocalGas) { |
nothing calls this directly
no test coverage detected