364 // NULL is being passed as the second VMRegPair array, so arguments are either |
364 // NULL is being passed as the second VMRegPair array, so arguments are either |
365 // passed in a register OR in a stack slot. |
365 // passed in a register OR in a stack slot. |
366 static int c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, VMRegPair *regs2, |
366 static int c_calling_convention(const BasicType *sig_bt, VMRegPair *regs, VMRegPair *regs2, |
367 int total_args_passed); |
367 int total_args_passed); |
368 |
368 |
|
369 // Compute the new number of arguments in the signature if 32 bit ints |
|
370 // must be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs |
|
371 // is true. |
|
372 static int convert_ints_to_longints_argcnt(int in_args_count, BasicType* in_sig_bt); |
|
373 // Adapt a method's signature if it contains 32 bit integers that must |
|
374 // be converted to longs. Needed if CCallingConventionRequiresIntsAsLongs |
|
375 // is true. |
|
376 static void convert_ints_to_longints(int i2l_argcnt, int& in_args_count, |
|
377 BasicType*& in_sig_bt, VMRegPair*& in_regs); |
|
378 |
369 // Generate I2C and C2I adapters. These adapters are simple argument marshalling |
379 // Generate I2C and C2I adapters. These adapters are simple argument marshalling |
370 // blobs. Unlike adapters in the tiger and earlier releases the code in these |
380 // blobs. Unlike adapters in the tiger and earlier releases the code in these |
371 // blobs does not create a new frame and are therefore virtually invisible |
381 // blobs does not create a new frame and are therefore virtually invisible |
372 // to the stack walking code. In general these blobs extend the callers stack |
382 // to the stack walking code. In general these blobs extend the callers stack |
373 // as needed for the conversion of argument locations. |
383 // as needed for the conversion of argument locations. |
376 // by the time we reach the blob there is compiled code available. This allows |
386 // by the time we reach the blob there is compiled code available. This allows |
377 // the blob to pass the incoming stack pointer (the sender sp) in a known |
387 // the blob to pass the incoming stack pointer (the sender sp) in a known |
378 // location for the interpreter to record. This is used by the frame code |
388 // location for the interpreter to record. This is used by the frame code |
379 // to correct the sender code to match up with the stack pointer when the |
389 // to correct the sender code to match up with the stack pointer when the |
380 // thread left the compiled code. In addition it allows the interpreter |
390 // thread left the compiled code. In addition it allows the interpreter |
381 // to remove the space the c2i adapter allocated to do it argument conversion. |
391 // to remove the space the c2i adapter allocated to do its argument conversion. |
382 |
392 |
383 // Although a c2i blob will always run interpreted even if compiled code is |
393 // Although a c2i blob will always run interpreted even if compiled code is |
384 // present if we see that compiled code is present the compiled call site |
394 // present if we see that compiled code is present the compiled call site |
385 // will be patched/re-resolved so that later calls will run compiled. |
395 // will be patched/re-resolved so that later calls will run compiled. |
386 |
396 |