Example #1
0
 private Function createClassInitWrapperFunction(FunctionRef targetFn) {
   Function fn = FunctionBuilder.clinitWrapper(targetFn);
   Value info = getInfoStruct(fn);
   Variable infoHeader = fn.newVariable(new PointerType(new StructureType(I8_PTR, I32)));
   fn.add(new Bitcast(infoHeader, info, infoHeader.getType()));
   Variable infoHeaderFlags = fn.newVariable(new PointerType(I32));
   fn.add(new Getelementptr(infoHeaderFlags, infoHeader.ref(), 0, 1));
   Variable flags = fn.newVariable(I32);
   fn.add(new Load(flags, infoHeaderFlags.ref()));
   Variable initializedFlag = fn.newVariable(I32);
   fn.add(new And(initializedFlag, flags.ref(), new IntegerConstant(CI_INITIALIZED)));
   Variable initialized = fn.newVariable(I1);
   fn.add(
       new Icmp(
           initialized,
           Icmp.Condition.eq,
           initializedFlag.ref(),
           new IntegerConstant(CI_INITIALIZED)));
   Label trueLabel = new Label();
   Label falseLabel = new Label();
   fn.add(
       new Br(initialized.ref(), fn.newBasicBlockRef(trueLabel), fn.newBasicBlockRef(falseLabel)));
   fn.newBasicBlock(trueLabel);
   Value result = call(fn, targetFn, fn.getParameterRefs());
   fn.add(new Ret(result));
   fn.newBasicBlock(falseLabel);
   call(fn, BC_INITIALIZE_CLASS, fn.getParameterRef(0), info);
   fn.add(new Br(fn.newBasicBlockRef(trueLabel)));
   return fn;
 }