{"action":"created","comment":{"url":"https://api.github.com/repos/eclipse/openj9/pulls/comments/195554984","pull_request_review_id":128939739,"id":195554984,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NTU1NDk4NA==","diff_hunk":"@@ -439,3 +459,537 @@ TR::Register * TR::S390CHelperLinkage::buildDirectDispatch(TR::Node * callNode,\n    \n    return returnReg;\n    }\n+\n+size_t\n+TR::S390CHelperLinkage::findHelperFunctionOffset(TR::Node* callNode, bool* isJNIIFAHelper, bool* isPreJNIHelper)\n+   {\n+   size_t helperOffset = -1;\n+   const char* jniCallName = callNode->getSymbolReference()->getSymbol()->getName();\n+\n+   if (strncmp(jniCallName, \"fast_jitPreJNICallOffloadCheck\", 30) == 0)\n+      {\n+      helperOffset = offsetof(J9JITConfig, fast_jitPreJNICallOffloadCheck);\n+      *isJNIIFAHelper = true;\n+      *isPreJNIHelper = true;\n+      }\n+   else if (strncmp(jniCallName, \"fast_jitPostJNICallOffloadCheck\", 31) == 0)\n+      {\n+      helperOffset = offsetof(J9JITConfig, fast_jitPostJNICallOffloadCheck);\n+      *isJNIIFAHelper = true;\n+      }\n+\n+   return helperOffset;\n+   }\n+\n+#if defined(J9ZOS390)\n+\n+void\n+TR::S390CHelperLinkage::saveFPRsOrVRFs(TR::Node * callNode,\n+                                       TR::Register* systemStackPointer,\n+                                       TR::Register* vmThreadRegister)\n+   {\n+   uint32_t stackBias = 2048;\n+\n+   TR::LabelSymbol * saveVolatileFPRLabel = generateLabelSymbol(cg());\n+   TR::LabelSymbol * doneSavingVolatilesLabel = generateLabelSymbol(cg());\n+\n+   // If the JavaVM has J9_EXTENDED_RUNTIME_USE_VECTOR_REGISTERS flag set, save all VRFs. Otherwise, save volatile FPRs\n+   // See definition of SAVE_C_VOLATILE_REGS\n+   generateRXInstruction(cg(), TR::InstOpCode::getLoadOpCode(), callNode, getS390RealRegister(TR::RealRegister::GPR8),\n+                         generateS390MemoryReference(vmThreadRegister, offsetof(J9VMThread, javaVM), cg()));\n+\n+   generateRXInstruction(cg(), TR::InstOpCode::getLoadOpCode(), callNode, getS390RealRegister(TR::RealRegister::GPR8),\n+                         generateS390MemoryReference(getS390RealRegister(TR::RealRegister::GPR8),\n+                                                     offsetof(J9JavaVM, extendedRuntimeFlags), cg()));\n+\n+   generateRIInstruction(cg(), TR::InstOpCode::getLoadHalfWordImmOpCode(), callNode,\n+                         getS390RealRegister(TR::RealRegister::GPR9), J9_EXTENDED_RUNTIME_USE_VECTOR_REGISTERS);\n+\n+   generateRRInstruction(cg(), TR::InstOpCode::NR, callNode,\n+                         getS390RealRegister(TR::RealRegister::GPR9),\n+                         getS390RealRegister(TR::RealRegister::GPR8));\n+\n+   generateS390BranchInstruction(cg(), TR::InstOpCode::BRC, TR::InstOpCode::COND_BRZ, callNode, saveVolatileFPRLabel);\n+\n+   // VRF save offsets defined as define({JIT_VR_SAVE_OFFSET},{eval(STACK_BIAS+J9TR_cframe_jitVRs+(($1)*16))})\n+   uint32_t J9TR_cframe_jitVRs = offsetof(J9CInterpreterStackFrame, jitVRs);\n+\n+   generateVRSaInstruction(cg(), TR::InstOpCode::VSTM, callNode,\n+                           getS390RealRegister(TR::RealRegister::VRF0),\n+                           getS390RealRegister(TR::RealRegister::VRF15),\n+                           generateS390MemoryReference(systemStackPointer, stackBias + J9TR_cframe_jitVRs + 0*16, cg()), 0);\n+\n+   generateVRSaInstruction(cg(), TR::InstOpCode::VSTM, callNode,\n+                           getS390RealRegister(TR::RealRegister::VRF24),\n+                           getS390RealRegister(TR::RealRegister::VRF31),\n+                           generateS390MemoryReference(systemStackPointer, stackBias + J9TR_cframe_jitVRs + 24*16, cg()), 0);\n+\n+   generateS390BranchInstruction(cg(), TR::InstOpCode::BRC, TR::InstOpCode::COND_BR, callNode, doneSavingVolatilesLabel);\n+\n+   generateS390LabelInstruction(cg(), TR::InstOpCode::LABEL, callNode, saveVolatileFPRLabel);\n+\n+   // define({JIT_FPR_SAVE_OFFSET},{eval(STACK_BIAS+J9TR_cframe_jitFPRs+(($1)*8))})\n+   uint32_t fprNum = 0;\n+   uint32_t cframeJitFPRs = offsetof(J9CInterpreterStackFrame, jitFPRs);\n+\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR0),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR1),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR2),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR3),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR4),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR5),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR6),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR7),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+\n+\n+   generateS390LabelInstruction(cg(), TR::InstOpCode::LABEL, callNode, doneSavingVolatilesLabel);\n+\n+#if defined(ASM_J9VM_PORT_ZOS_CEEHDLRSUPPORT)\n+   // save FPC\n+   // define({CEEHDLR_FPC_SAVE_OFFSET},{J9CONST(eval(STACK_BIAS+J9TR_cframe_fpcCEEHDLR),$1,$2)})\n+   uint32_t ceehdlrFPCSaveOffset = stackBias + offsetof(J9CInterpreterStackFrame, fpcCEEHDLR);\n+\n+   generateSInstruction(cg(), TR::InstOpCode::STFPC, callNode,\n+                        generateS390MemoryReference(systemStackPointer, ceehdlrFPCSaveOffset, cg()));\n+\n+   // Save FPR 8-15\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR8),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR8),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR10),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR11),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR12),\n+                          generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR13),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR14),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::STD, callNode, getS390RealRegister(TR::RealRegister::FPR15),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+#endif\n+   }\n+\n+/**\n+ *\n+*/\n+void\n+TR::S390CHelperLinkage::restoreRegistersForIFAHelper(TR::Node * callNode,\n+                                                    TR::Register* systemStackPointer,\n+                                                    TR::Register* vmThreadRegister)\n+   {\n+\n+   static bool saveAllRegs = feGetEnv(\"jni_helper_save_all_regs\") != NULL;\n+\n+   if (!saveAllRegs)\n+       return;\n+\n+   // CSP save offset is  JIT_GPR_SAVE_OFFSET(CSP) defined as:\n+   // define({JIT_GPR_SAVE_OFFSET},{eval(STACK_BIAS+J9TR_cframe_jitGPRs+((CSP)*J9TR_pointerSize))})\n+   //\n+   // C stack pointer (CSP) is GPR15 on zLinux, and GPR4 on zOS\n+   uint32_t cspNum = 4;\n+   uint32_t stackBias  = 2048;\n+   uint32_t cframeJitGPRs = offsetof(J9CInterpreterStackFrame, jitGPRs);\n+   uint32_t hprSaveBias = stackBias + cframeJitGPRs + 16*sizeof(intptrj_t);\n+\n+   if (TR::Compiler->target.isLinux())\n+      {\n+      cspNum = 15;\n+      stackBias = 0;\n+      }\n+\n+   TR::LabelSymbol * restoreVolatileFPRs = generateLabelSymbol(cg());\n+   TR::LabelSymbol * doneRestoringVolatilesLabel = generateLabelSymbol(cg());\n+\n+   // If the JavaVM has J9_EXTENDED_RUNTIME_USE_VECTOR_REGISTERS flag set, save all VRFs. Otherwise, save volatile FPRs\n+   // See definition of SAVE_C_VOLATILE_REGS\n+   // GPR8 and 9 are preserved. no need to reload them.\n+   generateRRInstruction(cg(), TR::InstOpCode::NR, callNode,\n+                         getS390RealRegister(TR::RealRegister::GPR9),\n+                         getS390RealRegister(TR::RealRegister::GPR8));\n+\n+   generateS390BranchInstruction(cg(), TR::InstOpCode::BRC, TR::InstOpCode::COND_BRZ, callNode, restoreVolatileFPRs);\n+\n+   // VRF save offsets defined as define({JIT_VR_SAVE_OFFSET},{eval(STACK_BIAS+J9TR_cframe_jitVRs+(($1)*16))})\n+   uint32_t J9TR_cframe_jitVRs = offsetof(J9CInterpreterStackFrame, jitVRs);\n+\n+   generateVRSaInstruction(cg(), TR::InstOpCode::VLM, callNode,\n+                           getS390RealRegister(TR::RealRegister::VRF0),\n+                           getS390RealRegister(TR::RealRegister::VRF15),\n+                           generateS390MemoryReference(systemStackPointer, stackBias + J9TR_cframe_jitVRs + 0*16, cg()), 0);\n+\n+   generateVRSaInstruction(cg(), TR::InstOpCode::VLM, callNode,\n+                           getS390RealRegister(TR::RealRegister::VRF24),\n+                           getS390RealRegister(TR::RealRegister::VRF31),\n+                           generateS390MemoryReference(systemStackPointer, stackBias + J9TR_cframe_jitVRs + 24*16, cg()), 0);\n+\n+   generateS390BranchInstruction(cg(), TR::InstOpCode::BRC, TR::InstOpCode::COND_BR, callNode, doneRestoringVolatilesLabel);\n+\n+   generateS390LabelInstruction(cg(), TR::InstOpCode::LABEL, callNode, restoreVolatileFPRs);\n+\n+   // define({JIT_FPR_SAVE_OFFSET},{eval(STACK_BIAS+J9TR_cframe_jitFPRs+(($1)*8))})\n+   uint32_t fprNum = 0;\n+   uint32_t cframeJitFPRs = offsetof(J9CInterpreterStackFrame, jitFPRs);\n+\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR0),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR1),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR2),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR3),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR4),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR5),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR6),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+   generateRXInstruction(cg(), TR::InstOpCode::LD, callNode, getS390RealRegister(TR::RealRegister::FPR7),\n+                         generateS390MemoryReference(systemStackPointer, stackBias + cframeJitFPRs + (fprNum++)*8, cg()));\n+\n+   generateS390LabelInstruction(cg(), TR::InstOpCode::LABEL, callNode, doneRestoringVolatilesLabel);\n+\n+   // restore all GPRs and HPRs\n+   //\n+   uint32_t gprSaveBias = stackBias + cframeJitGPRs;\n+   if (TR::Compiler->target.is32Bit() && cg()->supportsHighWordFacility())\n+      {\n+      generateRSInstruction(cg(), TR::InstOpCode::LMH, callNode,\n+                            getS390RealRegister(TR::RealRegister::HPR0),\n+                            getS390RealRegister(TR::RealRegister::HPR15),\n+                            generateS390MemoryReference(systemStackPointer, hprSaveBias, cg()));\n+      }\n+\n+   generateRSInstruction(cg(), TR::InstOpCode::getLoadMultipleOpCode(), callNode,\n+                         getS390RealRegister(TR::RealRegister::GPR0),\n+                         getS390RealRegister(TR::RealRegister::GPR15),\n+                         generateS390MemoryReference(systemStackPointer, gprSaveBias, cg()));\n+   }\n+\n+void\n+TR::S390CHelperLinkage::saveRegistersForIFAHelper(TR::Node * callNode,\n+                                                  TR::Register* systemStackPointer,\n+                                                  TR::Register* vmThreadRegister)\n+   {\n+   // CSP save offset is  JIT_GPR_SAVE_OFFSET(CSP) defined as:\n+   // define({JIT_GPR_SAVE_OFFSET},{eval(STACK_BIAS+J9TR_cframe_jitGPRs+((CSP)*J9TR_pointerSize))})\n+   //\n+   // C stack pointer (CSP) is GPR15 on zLinux, and GPR4 on zOS\n+   uint32_t cspNum = 4;\n+   uint32_t stackBias  = 2048;\n+   uint32_t cframeJitGPRs = offsetof(J9CInterpreterStackFrame, jitGPRs);\n+\n+   if (TR::Compiler->target.isLinux())\n+      {\n+      cspNum = 15;\n+      stackBias = 0;\n+      }\n+\n+   uint32_t cspSaveBias = stackBias + cframeJitGPRs + cspNum*sizeof(intptrj_t);\n+\n+   traceMsg(comp(), \"Nigel CHelper linkage cspNum %d, stackBias %d, cframeJitGPRs %d, stack pointer overall bias %d\\n\",\n+            cspNum, stackBias, cframeJitGPRs, cspSaveBias);\n+\n+   // store SSP to system stack SSP save slot\n+   // CEEHDLR will hang if the SSP is not in the returnValue field of J9VMThread\n+   generateSS1Instruction(cg(), TR::InstOpCode::MVC, callNode, sizeof(intptrj_t) - 1,\n+                          generateS390MemoryReference(systemStackPointer, cspSaveBias, cg()),\n+                          generateS390MemoryReference(vmThreadRegister, offsetof(J9VMThread, returnValue), cg()));\n+\n+   // The JNI definitly need GPR13 on the system stack for CEEHDLR.\n+   // Otherwise, the GPR13 will be 0 after JNI call returns. This leads to crashes in the JIT'ed code.\n+   uint32_t gpr13SaveOffset = stackBias + cframeJitGPRs + 13*sizeof(intptrj_t);\n+   generateRXInstruction(cg(), TR::InstOpCode::getStoreOpCode(), callNode, vmThreadRegister,\n+                         generateS390MemoryReference(systemStackPointer, gpr13SaveOffset, cg()));\n+\n+\n+   static bool saveAllRegs = feGetEnv(\"jni_helper_save_all_regs\") != NULL;\n+\n+   if (saveAllRegs)\n+      {\n+      uint32_t gprSaveBias = stackBias + cframeJitGPRs;\n+      uint32_t hprSaveBias = stackBias + cframeJitGPRs + 16*sizeof(intptrj_t);\n+\n+      // Save R0 to R15 to c stack\n+      generateRSInstruction(cg(), TR::InstOpCode::getStoreMultipleOpCode(), callNode,\n+                            getS390RealRegister(REGNUM(1)), getS390RealRegister(REGNUM(16)),\n+                            generateS390MemoryReference(systemStackPointer, gprSaveBias, cg()));\n+\n+      if (TR::Compiler->target.is32Bit() && cg()->supportsHighWordFacility())\n+         generateRSInstruction(cg(), TR::InstOpCode::STMH, callNode,\n+                               getS390RealRegister(TR::RealRegister::HPR0),\n+                               getS390RealRegister(TR::RealRegister::HPR15),\n+                               generateS390MemoryReference(systemStackPointer, hprSaveBias, cg()));\n+\n+      saveFPRsOrVRFs(callNode, systemStackPointer, vmThreadRegister);\n+      }\n+   }\n+#endif\n+\n+TR::Register *\n+TR::S390CHelperLinkage::buildIndirectDispatch(TR::Node * callNode,\n+                                              TR::RegisterDependencyConditions **deps,\n+                                              TR::Register *returnReg,\n+                                              bool isJNICallOutFrame)\n+   {\n+   RealRegisterManager realRegisterManager(cg());\n+   bool isHelperCallWithinICF = false;\n+   bool isJNIIFAHelper = false;         // to be determined by findHelperFunctionOffset() call\n+   bool isFastPathOnly = true;          // currently only used by JNI helpers. So this is always true.\n+   bool isPreJNIHelper = false;\n+   //TR_J9VMBase *fej9 = static_cast<TR_J9VMBase *>(fe());\n+   //bool isCEEHDLREnabled = (fej9->CEEHDLREnabled() && isJNICallOutFrame);\n+\n+   int32_t helperOffset = findHelperFunctionOffset(callNode, &isJNIIFAHelper, &isPreJNIHelper);\n+   TR_ASSERT_FATAL(helperOffset > 0, \"S390CHelperLinkage::buildIndirectDispatch Unable to find helper offset\");\n+\n+   TR::Register* systemStackPointer = NULL;\n+   if (isJNIIFAHelper)\n+      {\n+      TR::RealRegister::RegNum systemStackPointerRegNum = static_cast<TR::S390zOSSystemLinkage *>(cg()->getLinkage(TR_System))->getStackPointerRegister();\n+      systemStackPointer = (*deps)->searchPostConditionRegister(systemStackPointerRegNum);\n+      if (systemStackPointer != NULL)\n+         {\n+         traceMsg(comp(), \"CHelper linkage system sp pointer %d %s\\n\", systemStackPointerRegNum - 1, systemStackPointer->getRegisterName(comp()));\n+         realRegisterManager.assignRealRegisterToVirtualRegister(systemStackPointerRegNum, systemStackPointer);\n+         }\n+      }\n+\n+   traceMsg(comp(),\"%s: Internal Control Flow in OOL : %s\\n\",callNode->getOpCode().getName(), isHelperCallWithinICF  ? \"true\" : \"false\" );\n+   for (int i = TR::RealRegister::FirstGPR; i <= TR::RealRegister::LastHPR; i++)\n+      {\n+      if (!self()->getPreserved(REGNUM(i)) && cg()->machine()->getS390RealRegister(i)->getState() != TR::RealRegister::Locked)\n+         {\n+         realRegisterManager.use((TR::RealRegister::RegNum)i);\n+         }\n+      }\n+\n+   TR::RegisterDependencyConditions *childNodeRegDeps = generateRegisterDependencyConditions(0,callNode->getNumChildren(), cg());\n+   TR::RegisterDependencyConditions* preDeps = generateRegisterDependencyConditions(callNode->getNumChildren()+1, 0, cg());\n+   TR::Register *vmThreadRegister = cg()->getMethodMetaDataRealRegister();\n+   TR::Register *vmThreadArgReg = cg()->allocateRegister();\n+   generateRRInstruction(cg(), TR::InstOpCode::getLoadRegOpCode(), callNode, vmThreadArgReg, vmThreadRegister);\n+   preDeps->addPreCondition(vmThreadArgReg, getIntegerArgumentRegister(0));\n+   // TODO For Time Being, it is expected that param number won't increase beyond 3 need to fix this when support for stack is there\n+   for (int i=0; i< callNode->getNumChildren(); i++)\n+      {\n+      if (i < self()->getNumIntegerArgumentRegisters()-1)\n+         preDeps->addPreCondition(cg()->gprClobberEvaluate(callNode->getChild(i)), getIntegerArgumentRegister(i+1));\n+      else\n+         TR_ASSERT(false,\"Parameters on Stack not supported yet\");\n+      childNodeRegDeps->addPostConditionIfNotAlreadyInserted(callNode->getChild(i)->getRegister(), TR::RealRegister::AssignAny);\n+      }\n+\n+   TR::Register *javaStackPointerRegister = NULL;\n+   /* On zOS, we need to use GPR7 as return address for fastPath helper calls\n+   * Following line will use the System linkage's return address register for fast path\n+   * And for regular dual mode helper, private linkage's return address register\n+   */\n+   TR::RealRegister::RegNum regRANum = isFastPathOnly ? self()->getReturnAddressRegister() : cg()->getReturnAddressRegister();\n+   TR::Register *regRA = realRegisterManager.use(regRANum);\n+\n+#if defined(J9ZOS390)\n+   TR::Register *DSAPointerReg = NULL;\n+   uint32_t offsetOfSSP = static_cast<uint32_t>(offsetof(J9VMThread, systemStackPointer));\n+   uint32_t pointerSize = TR::Compiler->om.sizeofReferenceAddress() - 1;\n+#endif\n+\n+   TR::RegisterDependencyConditions * postDeps = realRegisterManager.buildRegisterDependencyConditions(regRANum);\n+   // If buildDirectDispatch is called within ICF we need to pass the dependencies which will be used there, else we need single dependencylist to be attached to the BRASL\n+   // We return postdependency conditions back to evaluator to merge with ICF condition and attach to merge label\n+   if (isHelperCallWithinICF )\n+      *deps = new (cg()->trHeapMemory()) TR::RegisterDependencyConditions(postDeps, childNodeRegDeps, cg());\n+\n+   int padding = 0;\n+   uint32_t offsetJ9SP = static_cast<uint32_t>(offsetof(J9VMThread, sp));\n+   TR::Instruction *cursor = NULL;\n+\n+   if (isFastPathOnly)\n+      {\n+      // Storing Java Stack Pointer\n+      javaStackPointerRegister = cg()->getStackPointerRealRegister();\n+      if (isJNIIFAHelper)\n+         {\n+         cursor = generateRXInstruction(cg(), TR::InstOpCode::getStoreOpCode(), callNode, systemStackPointer,\n+                                        generateS390MemoryReference(vmThreadRegister, offsetof(J9VMThread, returnValue), cg()));\n+         }\n+      else\n+         {\n+         cursor = generateRXInstruction(cg(), TR::InstOpCode::getStoreOpCode(), callNode, javaStackPointerRegister,\n+                                        generateS390MemoryReference(vmThreadRegister, offsetJ9SP, cg()));\n+         }\n+\n+#if defined(J9ZOS390)\n+      padding += 2;\n+      // Loading DSAPointer Register\n+\n+      if (isJNIIFAHelper)\n+         {\n+         // JNI IFA helpers before and after the JNI call should use the same system SP as the JNI call itself.\n+         DSAPointerReg = systemStackPointer;\n+         }\n+      else\n+         DSAPointerReg = realRegisterManager.use(getDSAPointerRegister());\n+\n+      generateRXInstruction(cg(), TR::InstOpCode::getLoadOpCode(), callNode, DSAPointerReg,\n+                            generateS390MemoryReference(vmThreadRegister, offsetOfSSP, cg()));\n+\n+      generateSS1Instruction(cg(), TR::InstOpCode::XC, callNode, pointerSize,\n+                             generateS390MemoryReference(vmThreadRegister, offsetOfSSP, cg()),\n+                             generateS390MemoryReference(vmThreadRegister, offsetOfSSP, cg()));\n+\n+      static bool saveRegsForPostJniIfaCall = feGetEnv(\"jni_save_regs_post_ifa\") != NULL;\n+\n+      if (isJNIIFAHelper)\n+         {\n+         if (isPreJNIHelper                                             // is pre jni IFA\n+                 || (saveRegsForPostJniIfaCall && !isPreJNIHelper)) // is post jni ifa and enable reg saving for post jni ifa call\n+            saveRegistersForIFAHelper(callNode, systemStackPointer, vmThreadRegister);\n+         }\n+\n+#if defined(TR_HOST_32BIT)\n+      padding += 2;\n+      // Loading CAA Pointer Register\n+      TR::Register *CAAPointerReg = realRegisterManager.use(getCAAPointerRegister());\n+      TR_J9VMBase *fej9 = (TR_J9VMBase *) cg()->comp()->fe();\n+      int32_t J9TR_CAA_save_offset = fej9->getCAASaveOffset();\n+      generateRXInstruction(cg(), TR::InstOpCode::getLoadOpCode(), callNode, CAAPointerReg,\n+                            generateS390MemoryReference(DSAPointerReg, J9TR_CAA_save_offset, cg()));\n+#endif\n+#endif\n+      }\n+\n+   TR::Register* nativeMethodEntryAddressReg = realRegisterManager.use(TR::RealRegister::GPR6);\n+\n+   // get JavaVM from VMThread\n+   cursor = generateRXInstruction(cg(), TR::InstOpCode::getLoadOpCode(), callNode, nativeMethodEntryAddressReg,\n+                         generateS390MemoryReference(vmThreadRegister,\n+                                                     offsetof(J9VMThread, javaVM), cg()));\n+\n+\n+   // get jitConfig from JavaJVM\n+   cursor = generateRXInstruction(cg(), TR::InstOpCode::getLoadOpCode(), callNode, nativeMethodEntryAddressReg,\n+                         generateS390MemoryReference(nativeMethodEntryAddressReg,\n+                                                     offsetof(J9JavaVM, jitConfig), cg()));\n+\n+\n+   // get J9TR_JitConfig_fast_jitPreJNICallOffloadCheck from jit config","path":"runtime/compiler/z/codegen/J9S390CHelperLinkage.cpp","position":473,"original_position":473,"commit_id":"7f72e1766921d5e0eb5e65aacaba3b27fc7856d9","original_commit_id":"7f72e1766921d5e0eb5e65aacaba3b27fc7856d9","user":{"login":"fjeremic","id":16259104,"node_id":"MDQ6VXNlcjE2MjU5MTA0","avatar_url":"https://avatars1.githubusercontent.com/u/16259104?v=4","gravatar_id":"","url":"https://api.github.com/users/fjeremic","html_url":"https://github.com/fjeremic","followers_url":"https://api.github.com/users/fjeremic/followers","following_url":"https://api.github.com/users/fjeremic/following{/other_user}","gists_url":"https://api.github.com/users/fjeremic/gists{/gist_id}","starred_url":"https://api.github.com/users/fjeremic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fjeremic/subscriptions","organizations_url":"https://api.github.com/users/fjeremic/orgs","repos_url":"https://api.github.com/users/fjeremic/repos","events_url":"https://api.github.com/users/fjeremic/events{/privacy}","received_events_url":"https://api.github.com/users/fjeremic/received_events","type":"User","site_admin":false},"body":"Isn't this a compile time constant? Why do we need these 3 indirections? i.e. how is this any different from `fast_jitInstanceOf`? Are we able to extract the address statically at compile time via:\r\n\r\n```\r\ncallNode->getSymbolReference()->getSymbol()->castToMethodSymbol()->getMethodAddress();\r\n```","created_at":"2018-06-14T20:08:41Z","updated_at":"2018-06-14T20:15:59Z","html_url":"https://github.com/eclipse/openj9/pull/2044#discussion_r195554984","pull_request_url":"https://api.github.com/repos/eclipse/openj9/pulls/2044","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/eclipse/openj9/pulls/comments/195554984"},"html":{"href":"https://github.com/eclipse/openj9/pull/2044#discussion_r195554984"},"pull_request":{"href":"https://api.github.com/repos/eclipse/openj9/pulls/2044"}}},"pull_request":{"url":"https://api.github.com/repos/eclipse/openj9/pulls/2044","id":191880281,"node_id":"MDExOlB1bGxSZXF1ZXN0MTkxODgwMjgx","html_url":"https://github.com/eclipse/openj9/pull/2044","diff_url":"https://github.com/eclipse/openj9/pull/2044.diff","patch_url":"https://github.com/eclipse/openj9/pull/2044.patch","issue_url":"https://api.github.com/repos/eclipse/openj9/issues/2044","number":2044,"state":"open","locked":false,"title":"Build JNI IFA switching helpers as C calls","user":{"login":"NigelYiboYu","id":22299200,"node_id":"MDQ6VXNlcjIyMjk5MjAw","avatar_url":"https://avatars2.githubusercontent.com/u/22299200?v=4","gravatar_id":"","url":"https://api.github.com/users/NigelYiboYu","html_url":"https://github.com/NigelYiboYu","followers_url":"https://api.github.com/users/NigelYiboYu/followers","following_url":"https://api.github.com/users/NigelYiboYu/following{/other_user}","gists_url":"https://api.github.com/users/NigelYiboYu/gists{/gist_id}","starred_url":"https://api.github.com/users/NigelYiboYu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NigelYiboYu/subscriptions","organizations_url":"https://api.github.com/users/NigelYiboYu/orgs","repos_url":"https://api.github.com/users/NigelYiboYu/repos","events_url":"https://api.github.com/users/NigelYiboYu/events{/privacy}","received_events_url":"https://api.github.com/users/NigelYiboYu/received_events","type":"User","site_admin":false},"body":"The JNI IFA switching on and off helpers use transition assembly sequences\r\nthat saves and restores all GPRs, all FPRs and volatile VRFs. This is slow\r\nand unnecessary.\r\n\r\nThis commit changes builds IFA calls as C function calls, which saves only\r\nthe assigned registers.\r\n\r\nSigned-off-by: Nigel Yu <yunigel@ca.ibm.com>","created_at":"2018-05-31T21:35:08Z","updated_at":"2018-06-14T20:15:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"c4ca999ac22bc4fb0101f175b34902340fe06d1b","assignee":{"login":"fjeremic","id":16259104,"node_id":"MDQ6VXNlcjE2MjU5MTA0","avatar_url":"https://avatars1.githubusercontent.com/u/16259104?v=4","gravatar_id":"","url":"https://api.github.com/users/fjeremic","html_url":"https://github.com/fjeremic","followers_url":"https://api.github.com/users/fjeremic/followers","following_url":"https://api.github.com/users/fjeremic/following{/other_user}","gists_url":"https://api.github.com/users/fjeremic/gists{/gist_id}","starred_url":"https://api.github.com/users/fjeremic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fjeremic/subscriptions","organizations_url":"https://api.github.com/users/fjeremic/orgs","repos_url":"https://api.github.com/users/fjeremic/repos","events_url":"https://api.github.com/users/fjeremic/events{/privacy}","received_events_url":"https://api.github.com/users/fjeremic/received_events","type":"User","site_admin":false},"assignees":[{"login":"fjeremic","id":16259104,"node_id":"MDQ6VXNlcjE2MjU5MTA0","avatar_url":"https://avatars1.githubusercontent.com/u/16259104?v=4","gravatar_id":"","url":"https://api.github.com/users/fjeremic","html_url":"https://github.com/fjeremic","followers_url":"https://api.github.com/users/fjeremic/followers","following_url":"https://api.github.com/users/fjeremic/following{/other_user}","gists_url":"https://api.github.com/users/fjeremic/gists{/gist_id}","starred_url":"https://api.github.com/users/fjeremic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fjeremic/subscriptions","organizations_url":"https://api.github.com/users/fjeremic/orgs","repos_url":"https://api.github.com/users/fjeremic/repos","events_url":"https://api.github.com/users/fjeremic/events{/privacy}","received_events_url":"https://api.github.com/users/fjeremic/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[{"id":697962585,"node_id":"MDU6TGFiZWw2OTc5NjI1ODU=","url":"https://api.github.com/repos/eclipse/openj9/labels/comp:jit","name":"comp:jit","color":"1d76db","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/eclipse/openj9/pulls/2044/commits","review_comments_url":"https://api.github.com/repos/eclipse/openj9/pulls/2044/comments","review_comment_url":"https://api.github.com/repos/eclipse/openj9/pulls/comments{/number}","comments_url":"https://api.github.com/repos/eclipse/openj9/issues/2044/comments","statuses_url":"https://api.github.com/repos/eclipse/openj9/statuses/7f72e1766921d5e0eb5e65aacaba3b27fc7856d9","head":{"label":"NigelYiboYu:jni-call-prejni","ref":"jni-call-prejni","sha":"7f72e1766921d5e0eb5e65aacaba3b27fc7856d9","user":{"login":"NigelYiboYu","id":22299200,"node_id":"MDQ6VXNlcjIyMjk5MjAw","avatar_url":"https://avatars2.githubusercontent.com/u/22299200?v=4","gravatar_id":"","url":"https://api.github.com/users/NigelYiboYu","html_url":"https://github.com/NigelYiboYu","followers_url":"https://api.github.com/users/NigelYiboYu/followers","following_url":"https://api.github.com/users/NigelYiboYu/following{/other_user}","gists_url":"https://api.github.com/users/NigelYiboYu/gists{/gist_id}","starred_url":"https://api.github.com/users/NigelYiboYu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NigelYiboYu/subscriptions","organizations_url":"https://api.github.com/users/NigelYiboYu/orgs","repos_url":"https://api.github.com/users/NigelYiboYu/repos","events_url":"https://api.github.com/users/NigelYiboYu/events{/privacy}","received_events_url":"https://api.github.com/users/NigelYiboYu/received_events","type":"User","site_admin":false},"repo":{"id":103434311,"node_id":"MDEwOlJlcG9zaXRvcnkxMDM0MzQzMTE=","name":"openj9","full_name":"NigelYiboYu/openj9","owner":{"login":"NigelYiboYu","id":22299200,"node_id":"MDQ6VXNlcjIyMjk5MjAw","avatar_url":"https://avatars2.githubusercontent.com/u/22299200?v=4","gravatar_id":"","url":"https://api.github.com/users/NigelYiboYu","html_url":"https://github.com/NigelYiboYu","followers_url":"https://api.github.com/users/NigelYiboYu/followers","following_url":"https://api.github.com/users/NigelYiboYu/following{/other_user}","gists_url":"https://api.github.com/users/NigelYiboYu/gists{/gist_id}","starred_url":"https://api.github.com/users/NigelYiboYu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/NigelYiboYu/subscriptions","organizations_url":"https://api.github.com/users/NigelYiboYu/orgs","repos_url":"https://api.github.com/users/NigelYiboYu/repos","events_url":"https://api.github.com/users/NigelYiboYu/events{/privacy}","received_events_url":"https://api.github.com/users/NigelYiboYu/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/NigelYiboYu/openj9","description":"OpenJ9","fork":true,"url":"https://api.github.com/repos/NigelYiboYu/openj9","forks_url":"https://api.github.com/repos/NigelYiboYu/openj9/forks","keys_url":"https://api.github.com/repos/NigelYiboYu/openj9/keys{/key_id}","collaborators_url":"https://api.github.com/repos/NigelYiboYu/openj9/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/NigelYiboYu/openj9/teams","hooks_url":"https://api.github.com/repos/NigelYiboYu/openj9/hooks","issue_events_url":"https://api.github.com/repos/NigelYiboYu/openj9/issues/events{/number}","events_url":"https://api.github.com/repos/NigelYiboYu/openj9/events","assignees_url":"https://api.github.com/repos/NigelYiboYu/openj9/assignees{/user}","branches_url":"https://api.github.com/repos/NigelYiboYu/openj9/branches{/branch}","tags_url":"https://api.github.com/repos/NigelYiboYu/openj9/tags","blobs_url":"https://api.github.com/repos/NigelYiboYu/openj9/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/NigelYiboYu/openj9/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/NigelYiboYu/openj9/git/refs{/sha}","trees_url":"https://api.github.com/repos/NigelYiboYu/openj9/git/trees{/sha}","statuses_url":"https://api.github.com/repos/NigelYiboYu/openj9/statuses/{sha}","languages_url":"https://api.github.com/repos/NigelYiboYu/openj9/languages","stargazers_url":"https://api.github.com/repos/NigelYiboYu/openj9/stargazers","contributors_url":"https://api.github.com/repos/NigelYiboYu/openj9/contributors","subscribers_url":"https://api.github.com/repos/NigelYiboYu/openj9/subscribers","subscription_url":"https://api.github.com/repos/NigelYiboYu/openj9/subscription","commits_url":"https://api.github.com/repos/NigelYiboYu/openj9/commits{/sha}","git_commits_url":"https://api.github.com/repos/NigelYiboYu/openj9/git/commits{/sha}","comments_url":"https://api.github.com/repos/NigelYiboYu/openj9/comments{/number}","issue_comment_url":"https://api.github.com/repos/NigelYiboYu/openj9/issues/comments{/number}","contents_url":"https://api.github.com/repos/NigelYiboYu/openj9/contents/{+path}","compare_url":"https://api.github.com/repos/NigelYiboYu/openj9/compare/{base}...{head}","merges_url":"https://api.github.com/repos/NigelYiboYu/openj9/merges","archive_url":"https://api.github.com/repos/NigelYiboYu/openj9/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/NigelYiboYu/openj9/downloads","issues_url":"https://api.github.com/repos/NigelYiboYu/openj9/issues{/number}","pulls_url":"https://api.github.com/repos/NigelYiboYu/openj9/pulls{/number}","milestones_url":"https://api.github.com/repos/NigelYiboYu/openj9/milestones{/number}","notifications_url":"https://api.github.com/repos/NigelYiboYu/openj9/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/NigelYiboYu/openj9/labels{/name}","releases_url":"https://api.github.com/repos/NigelYiboYu/openj9/releases{/id}","deployments_url":"https://api.github.com/repos/NigelYiboYu/openj9/deployments","created_at":"2017-09-13T18:10:42Z","updated_at":"2017-09-13T18:11:10Z","pushed_at":"2018-06-13T14:52:40Z","git_url":"git://github.com/NigelYiboYu/openj9.git","ssh_url":"git@github.com:NigelYiboYu/openj9.git","clone_url":"https://github.com/NigelYiboYu/openj9.git","svn_url":"https://github.com/NigelYiboYu/openj9","homepage":null,"size":30767,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"eclipse:master","ref":"master","sha":"88cff852e15fa77e1091c525e4a6f8ef8af8a24a","user":{"login":"eclipse","id":56974,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU2OTc0","avatar_url":"https://avatars1.githubusercontent.com/u/56974?v=4","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"repo":{"id":101408117,"node_id":"MDEwOlJlcG9zaXRvcnkxMDE0MDgxMTc=","name":"openj9","full_name":"eclipse/openj9","owner":{"login":"eclipse","id":56974,"node_id":"MDEyOk9yZ2FuaXphdGlvbjU2OTc0","avatar_url":"https://avatars1.githubusercontent.com/u/56974?v=4","gravatar_id":"","url":"https://api.github.com/users/eclipse","html_url":"https://github.com/eclipse","followers_url":"https://api.github.com/users/eclipse/followers","following_url":"https://api.github.com/users/eclipse/following{/other_user}","gists_url":"https://api.github.com/users/eclipse/gists{/gist_id}","starred_url":"https://api.github.com/users/eclipse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/eclipse/subscriptions","organizations_url":"https://api.github.com/users/eclipse/orgs","repos_url":"https://api.github.com/users/eclipse/repos","events_url":"https://api.github.com/users/eclipse/events{/privacy}","received_events_url":"https://api.github.com/users/eclipse/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/eclipse/openj9","description":"Eclipse OpenJ9: A Java Virtual Machine for OpenJDK that's optimized for small footprint, fast start-up, and high throughput.   Builds on Eclipse OMR (https://github.com/eclipse/omr) and combines with the Extensions for OpenJDK for OpenJ9 repo.","fork":false,"url":"https://api.github.com/repos/eclipse/openj9","forks_url":"https://api.github.com/repos/eclipse/openj9/forks","keys_url":"https://api.github.com/repos/eclipse/openj9/keys{/key_id}","collaborators_url":"https://api.github.com/repos/eclipse/openj9/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/eclipse/openj9/teams","hooks_url":"https://api.github.com/repos/eclipse/openj9/hooks","issue_events_url":"https://api.github.com/repos/eclipse/openj9/issues/events{/number}","events_url":"https://api.github.com/repos/eclipse/openj9/events","assignees_url":"https://api.github.com/repos/eclipse/openj9/assignees{/user}","branches_url":"https://api.github.com/repos/eclipse/openj9/branches{/branch}","tags_url":"https://api.github.com/repos/eclipse/openj9/tags","blobs_url":"https://api.github.com/repos/eclipse/openj9/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/eclipse/openj9/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/eclipse/openj9/git/refs{/sha}","trees_url":"https://api.github.com/repos/eclipse/openj9/git/trees{/sha}","statuses_url":"https://api.github.com/repos/eclipse/openj9/statuses/{sha}","languages_url":"https://api.github.com/repos/eclipse/openj9/languages","stargazers_url":"https://api.github.com/repos/eclipse/openj9/stargazers","contributors_url":"https://api.github.com/repos/eclipse/openj9/contributors","subscribers_url":"https://api.github.com/repos/eclipse/openj9/subscribers","subscription_url":"https://api.github.com/repos/eclipse/openj9/subscription","commits_url":"https://api.github.com/repos/eclipse/openj9/commits{/sha}","git_commits_url":"https://api.github.com/repos/eclipse/openj9/git/commits{/sha}","comments_url":"https://api.github.com/repos/eclipse/openj9/comments{/number}","issue_comment_url":"https://api.github.com/repos/eclipse/openj9/issues/comments{/number}","contents_url":"https://api.github.com/repos/eclipse/openj9/contents/{+path}","compare_url":"https://api.github.com/repos/eclipse/openj9/compare/{base}...{head}","merges_url":"https://api.github.com/repos/eclipse/openj9/merges","archive_url":"https://api.github.com/repos/eclipse/openj9/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/eclipse/openj9/downloads","issues_url":"https://api.github.com/repos/eclipse/openj9/issues{/number}","pulls_url":"https://api.github.com/repos/eclipse/openj9/pulls{/number}","milestones_url":"https://api.github.com/repos/eclipse/openj9/milestones{/number}","notifications_url":"https://api.github.com/repos/eclipse/openj9/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/eclipse/openj9/labels{/name}","releases_url":"https://api.github.com/repos/eclipse/openj9/releases{/id}","deployments_url":"https://api.github.com/repos/eclipse/openj9/deployments","created_at":"2017-08-25T13:46:07Z","updated_at":"2018-06-14T19:25:47Z","pushed_at":"2018-06-14T19:44:14Z","git_url":"git://github.com/eclipse/openj9.git","ssh_url":"git@github.com:eclipse/openj9.git","clone_url":"https://github.com/eclipse/openj9.git","svn_url":"https://github.com/eclipse/openj9","homepage":"","size":30820,"stargazers_count":1274,"watchers_count":1274,"language":"Java","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":261,"mirror_url":null,"archived":false,"open_issues_count":409,"license":{"key":"other","name":"Other","spdx_id":null,"url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":261,"open_issues":409,"watchers":1274,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/eclipse/openj9/pulls/2044"},"html":{"href":"https://github.com/eclipse/openj9/pull/2044"},"issue":{"href":"https://api.github.com/repos/eclipse/openj9/issues/2044"},"comments":{"href":"https://api.github.com/repos/eclipse/openj9/issues/2044/comments"},"review_comments":{"href":"https://api.github.com/repos/eclipse/openj9/pulls/2044/comments"},"review_comment":{"href":"https://api.github.com/repos/eclipse/openj9/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/eclipse/openj9/pulls/2044/commits"},"statuses":{"href":"https://api.github.com/repos/eclipse/openj9/statuses/7f72e1766921d5e0eb5e65aacaba3b27fc7856d9"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"fjeremic"}}