MCPcopy Create free account
hub / github.com/WasmEdge/WasmEdge / updateGas

Method updateGas

lib/llvm/compiler.cpp:4199–4241  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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) {

Callers

nothing calls this directly

Calls 15

getInsertBlockMethod · 0.80
createLoadMethod · 0.80
setAlignmentMethod · 0.80
getGasMethod · 0.80
getGasLimitMethod · 0.80
setOrderingMethod · 0.80
createBrMethod · 0.80
positionAtEndMethod · 0.80
createPHIMethod · 0.80
createAddMethod · 0.80
createLikelyMethod · 0.80
createICmpULEMethod · 0.80

Tested by

no test coverage detected