# 重新分析帧槽创建顺序 # 在 LowerFunctionParams 中: # - 前8个参数:创建参数帧槽(CreateFrameIndex) # - 第9个及以后的参数:创建参数帧槽+ 创建arg_slot(CreateCalleeStackArgFrameIndex) num_params = 500 # 模拟帧槽创建 slots = [] for i in range(num_params): if i < 8: # 前8个参数:只创建参数帧槽 slots.append(('param', i, False, False)) # (type, index, is_stack_arg, is_callee_stack_arg) else: # 第9个及以后的参数:创建参数帧槽和arg_slot slots.append(('param', i, False, False)) # 参数帧槽 slots.append(('arg_slot', i, True, True)) # arg_slot # 然后是alloca帧槽 num_alloca = 500 for i in range(num_alloca): slots.append(('alloca', num_params + i, False, False)) # 然后是load帧槽 slots.append(('load', num_params + num_alloca, False, False)) print(f"总帧槽数: {len(slots)}") # 计算偏移量 local_cursor = 0 stack_arg_cursor = 0 for slot_type, index, is_stack_arg, is_callee_stack_arg in slots: if is_stack_arg: offset = stack_arg_cursor stack_arg_cursor += 8 else: local_cursor = ((local_cursor + 4 - 1) // 4) * 4 local_cursor += 4 offset = -local_cursor # 计算local_size local_size = ((local_cursor + 16 - 1) // 16) * 16 print(f"local_cursor = {local_cursor}") print(f"local_size = {local_size}") # 计算sp_offset_base sp_offset_base = local_size + 16 print(f"sp_offset_base = {sp_offset_base}") # 找到第500个参数的相关帧槽 print("\n第500个参数的相关帧槽:") param_slot_idx = None arg_slot_idx = None for i, (slot_type, index, is_stack_arg, is_callee_stack_arg) in enumerate(slots): if slot_type == 'param' and index == 499: param_slot_idx = i if slot_type == 'arg_slot' and index == 499: arg_slot_idx = i print(f" 参数帧槽索引: {param_slot_idx}") print(f" arg_slot索引: {arg_slot_idx}") # 计算这些帧槽的偏移量 local_cursor = 0 stack_arg_cursor = 0 for i, (slot_type, index, is_stack_arg, is_callee_stack_arg) in enumerate(slots): if is_stack_arg: offset = stack_arg_cursor stack_arg_cursor += 8 else: local_cursor = ((local_cursor + 4 - 1) // 4) * 4 local_cursor += 4 offset = -local_cursor if i == param_slot_idx: print(f" 参数帧槽: offset = {offset}") if i == arg_slot_idx: final_offset = sp_offset_base + offset print(f" arg_slot: offset = {final_offset} (原offset = {offset})") # 找到第500个alloca帧槽 print("\n第500个alloca帧槽:") alloca_slot_idx = None for i, (slot_type, index, is_stack_arg, is_callee_stack_arg) in enumerate(slots): if slot_type == 'alloca' and index == num_params + 499: alloca_slot_idx = i break print(f" alloca帧槽索引: {alloca_slot_idx}") # 计算偏移量 local_cursor = 0 stack_arg_cursor = 0 for i, (slot_type, index, is_stack_arg, is_callee_stack_arg) in enumerate(slots): if is_stack_arg: offset = stack_arg_cursor stack_arg_cursor += 8 else: local_cursor = ((local_cursor + 4 - 1) // 4) * 4 local_cursor += 4 offset = -local_cursor if i == alloca_slot_idx: print(f" alloca帧槽: offset = {offset}") break # 找到load帧槽 print("\nload帧槽:") load_slot_idx = len(slots) - 1 print(f" load帧槽索引: {load_slot_idx}") # 计算偏移量 local_cursor = 0 stack_arg_cursor = 0 for i, (slot_type, index, is_stack_arg, is_callee_stack_arg) in enumerate(slots): if is_stack_arg: offset = stack_arg_cursor stack_arg_cursor += 8 else: local_cursor = ((local_cursor + 4 - 1) // 4) * 4 local_cursor += 4 offset = -local_cursor if i == load_slot_idx: print(f" load帧槽: offset = {offset}") break