summaryrefslogtreecommitdiff
path: root/compiler/optimizing/code_generator.h
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing/code_generator.h')
-rw-r--r--compiler/optimizing/code_generator.h32
1 files changed, 32 insertions, 0 deletions
diff --git a/compiler/optimizing/code_generator.h b/compiler/optimizing/code_generator.h
index ff2be4740d..4bfc14a12b 100644
--- a/compiler/optimizing/code_generator.h
+++ b/compiler/optimizing/code_generator.h
@@ -570,6 +570,28 @@ class CodeGenerator : public DeletableArenaObject<kArenaAllocCodeGenerator> {
static void CreateCommonInvokeLocationSummary(
HInvoke* invoke, InvokeDexCallingConventionVisitor* visitor);
+ template <typename CriticalNativeCallingConventionVisitor,
+ size_t kNativeStackAlignment,
+ size_t GetCriticalNativeDirectCallFrameSize(const char* shorty, uint32_t shorty_len)>
+ static size_t PrepareCriticalNativeCall(HInvokeStaticOrDirect* invoke,
+ /*out*/HParallelMove* parallel_move) {
+ DCHECK(!invoke->GetLocations()->Intrinsified());
+ CriticalNativeCallingConventionVisitor calling_convention_visitor(
+ /*for_register_allocation=*/ false);
+ PrepareCriticalNativeArgumentMoves(invoke, &calling_convention_visitor, parallel_move);
+ size_t out_frame_size =
+ RoundUp(calling_convention_visitor.GetStackOffset(), kNativeStackAlignment);
+ if (kIsDebugBuild) {
+ uint32_t shorty_len;
+ const char* shorty = GetCriticalNativeShorty(invoke, &shorty_len);
+ DCHECK_EQ(GetCriticalNativeDirectCallFrameSize(shorty, shorty_len), out_frame_size);
+ }
+ if (out_frame_size != 0u) {
+ AdjustCriticalNativeArgumentMoves(out_frame_size, parallel_move);
+ }
+ return out_frame_size;
+ }
+
void GenerateInvokeStaticOrDirectRuntimeCall(
HInvokeStaticOrDirect* invoke, Location temp, SlowPathCode* slow_path);
@@ -799,6 +821,16 @@ class CodeGenerator : public DeletableArenaObject<kArenaAllocCodeGenerator> {
bool needs_vreg_info = true);
void EmitVRegInfo(HEnvironment* environment, SlowPathCode* slow_path);
+ static void PrepareCriticalNativeArgumentMoves(
+ HInvokeStaticOrDirect* invoke,
+ /*inout*/InvokeDexCallingConventionVisitor* visitor,
+ /*out*/HParallelMove* parallel_move);
+
+ static void AdjustCriticalNativeArgumentMoves(size_t out_frame_size,
+ /*inout*/HParallelMove* parallel_move);
+
+ static const char* GetCriticalNativeShorty(HInvokeStaticOrDirect* invoke, uint32_t* shorty_len);
+
OptimizingCompilerStats* stats_;
HGraph* const graph_;