You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
nudt-compiler-cpp/test_tmp/debug_frame2.py

122 lines
3.4 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 分析汇编代码中的帧槽偏移量
# 从汇编代码中提取的偏移量:
# 第500个参数的参数帧槽[sp, #7960]
# 第500个参数的alloca帧槽[x29-2000]
# LowerLoadInst创建的帧槽[x29-4000]
# 计算帧槽索引和偏移量
# 假设有500个参数500个alloca1个load
# 参数帧槽(索引 0-499
# 前8个参数is_stack_arg = false
# 第9-500个参数is_stack_arg = true, is_callee_stack_arg = true
# alloca帧槽索引 500-999
# is_stack_arg = false
# load帧槽索引 1000
# is_stack_arg = false
# 计算偏移量
num_params = 500
num_alloca = 500
# 模拟帧槽创建
slots = []
for i in range(num_params):
if i < 8:
slots.append((i, False, False)) # (index, is_stack_arg, is_callee_stack_arg)
else:
slots.append((i, True, True))
for i in range(num_alloca):
slots.append((num_params + i, False, False))
slots.append((num_params + num_alloca, False, False))
# 计算偏移量
local_cursor = 0
stack_arg_cursor = 0
for 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}")
# 更新is_callee_stack_arg的偏移量
print("\n第500个参数的参数帧槽索引 499:")
index = 499
_, is_stack_arg, is_callee_stack_arg = slots[index]
# 重新计算偏移量
local_cursor = 0
stack_arg_cursor = 0
for i, (idx, is_sa, is_csa) in enumerate(slots):
if is_sa:
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 == index:
if is_csa:
final_offset = sp_offset_base + offset
else:
final_offset = offset
print(f" 索引 {idx}: offset = {final_offset} (is_stack_arg = {is_sa}, is_callee_stack_arg = {is_csa})")
break
print("\n第500个参数的alloca帧槽索引 999:")
index = 999
local_cursor = 0
stack_arg_cursor = 0
for i, (idx, is_sa, is_csa) in enumerate(slots):
if is_sa:
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 == index:
if is_csa:
final_offset = sp_offset_base + offset
else:
final_offset = offset
print(f" 索引 {idx}: offset = {final_offset} (is_stack_arg = {is_sa}, is_callee_stack_arg = {is_csa})")
break
print("\nload帧槽索引 1000:")
index = 1000
local_cursor = 0
stack_arg_cursor = 0
for i, (idx, is_sa, is_csa) in enumerate(slots):
if is_sa:
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 == index:
if is_csa:
final_offset = sp_offset_base + offset
else:
final_offset = offset
print(f" 索引 {idx}: offset = {final_offset} (is_stack_arg = {is_sa}, is_callee_stack_arg = {is_csa})")
break