// differ in the behaviour, so explicitly set the CFA to avoid any ambiguity.
// The restored CFA state should match the CFA state during CFI_REMEMBER_STATE.
// `objdump -Wf libart.so | egrep "_cfa|_state"` is useful to audit the opcodes.
- #define CFI_RESTORE_STATE_AND_DEF_CFA(reg,off) .cfi_restore_state .cfi_def_cfa reg,off
+ MACRO2(CFI_RESTORE_STATE_AND_DEF_CFA, reg, off)
+ .cfi_restore_state
+ .cfi_def_cfa \reg,\off
+ END_MACRO
#define CFI_ESCAPE(...) .cfi_escape __VA_ARGS__
#else
// Mac OS' doesn't like cfi_* directives.
#define BLK2 BLK1+4
#define LEN BLK2+4
#define RETURN_END POP (%edi); POP (%esi); POP (%ebx); ret
-#define RETURN RETURN_END; CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16); CFI_REMEMBER_STATE
+MACRO0(RETURN)
+ RETURN_END
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
+ CFI_REMEMBER_STATE
+END_MACRO
DEFINE_FUNCTION MEMCMP
movl LEN(%esp), %ecx
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_0_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_2):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_2_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_4):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_4_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_6):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_6_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_8):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_8_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_10):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_10_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_12):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_12_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_14):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(shr_14_gobble):
POP (%esi)
jmp L(less48bytes)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
CFI_REMEMBER_STATE
.p2align 4
L(exit):
CFI_REMEMBER_STATE
RESTORE_SAVE_EVERYTHING_FRAME_KEEP_EAX // restore frame up to return address
ret // return
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, FRAME_SIZE_SAVE_EVERYTHING)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, FRAME_SIZE_SAVE_EVERYTHING
1:
DELIVER_PENDING_EXCEPTION_FRAME_READY
END_FUNCTION VAR(c_name)
POP ESI
POP EDI
jmp *ART_METHOD_QUICK_CODE_OFFSET_32(%eax)
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
.Limt_table_next_entry:
// If the entry is null, the interface method is not in the ImtConflictTable.
cmpl LITERAL(0), 0(%edi)
POP ESI
POP EDI
INVOKE_TRAMPOLINE_BODY artInvokeInterfaceTrampoline
- CFI_RESTORE_STATE_AND_DEF_CFA(esp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA esp, 16
.Limt_conflict_trampoline_dex_cache_miss:
// We're not creating a proper runtime method frame here,
// artLookupResolvedMethod() is not allowed to walk the stack.
mov %edx, 4(%ecx) // Store the other half of the result.
ret
.Losr_entry:
- CFI_RESTORE_STATE_AND_DEF_CFA(ebp, SAVE_SIZE) // CFA = ebp + SAVE_SIZE
+ CFI_RESTORE_STATE_AND_DEF_CFA ebp, SAVE_SIZE // CFA = ebp + SAVE_SIZE
subl LITERAL(4), %ecx // Given stack size contains pushed frame pointer, substract it.
subl %ecx, %esp
mov %esp, %edi // EDI = beginning of stack
// differ in the behaviour, so explicitly set the CFA to avoid any ambiguity.
// The restored CFA state should match the CFA state during CFI_REMEMBER_STATE.
// `objdump -Wf libart.so | egrep "_cfa|_state"` is useful to audit the opcodes.
- #define CFI_RESTORE_STATE_AND_DEF_CFA(reg,off) .cfi_restore_state .cfi_def_cfa reg,off
+ MACRO2(CFI_RESTORE_STATE_AND_DEF_CFA, reg, off)
+ .cfi_restore_state
+ .cfi_def_cfa \reg,\off
+ END_MACRO
#define CFI_RESTORE_STATE .cfi_restore_state
#else
// Mac OS' doesn't like cfi_* directives.
#define CFI_REL_OFFSET(reg,size)
#define CFI_REMEMBER_STATE
#define CFI_RESTORE_STATE_AND_DEF_CFA(off)
+ MACRO2(CFI_RESTORE_STATE_AND_DEF_CFA, reg, off)
+ END_MACRO
#define CFI_RESTORE_STATE
#endif
CFI_REMEMBER_STATE
RESTORE_SAVE_EVERYTHING_FRAME_KEEP_RAX // restore frame up to return address
ret
- CFI_RESTORE_STATE_AND_DEF_CFA(rsp, FRAME_SIZE_SAVE_EVERYTHING)
+ CFI_RESTORE_STATE_AND_DEF_CFA rsp, FRAME_SIZE_SAVE_EVERYTHING
1:
DELIVER_PENDING_EXCEPTION_FRAME_READY
END_FUNCTION VAR(c_name)
addq LITERAL(24), %rsp // pop arguments
CFI_ADJUST_CFA_OFFSET(-24)
ret
- CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 64) // Reset unwind info so following code unwinds.
+ CFI_RESTORE_STATE_AND_DEF_CFA rsp, 64 // Reset unwind info so following code unwinds.
.Lthrow_class_cast_exception:
RESTORE_FP_CALLEE_SAVE_FRAME
CFI_REMEMBER_STATE
POP rdx
jmp *ART_METHOD_QUICK_CODE_OFFSET_64(%rdi)
- CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA rsp, 16
.Limt_table_next_entry:
// If the entry is null, the interface method is not in the ImtConflictTable.
cmpq LITERAL(0), 0(%rdi)
POP rdx
movq %rax, %rdi // Load interface method
INVOKE_TRAMPOLINE_BODY artInvokeInterfaceTrampoline
- CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 16)
+ CFI_RESTORE_STATE_AND_DEF_CFA rsp, 16
.Limt_conflict_trampoline_dex_cache_miss:
// We're not creating a proper runtime method frame here,
// artLookupResolvedMethod() is not allowed to walk the stack.
movq %rax, (%rcx) // Store the result.
ret
.Losr_entry:
- CFI_RESTORE_STATE_AND_DEF_CFA(rsp, 80)
+ CFI_RESTORE_STATE_AND_DEF_CFA rsp, 80
// Since the call has pushed the return address we need to switch the CFA register to RBP.
CFI_DEF_CFA_REGISTER(rbp)