1 // Copyright 2017 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #pragma once
6 
7 #ifndef __has_feature
8 #define __has_feature(x) 0
9 #endif
10 
11 #define ENTRY(name) \
12     .globl name; \
13     .type name, %function; \
14 name: \
15     .cfi_startproc
16 
17 #define END(name) \
18     .cfi_endproc; \
19     .size name, . - name
20 
21 // This copies the .type and .size info as well as the value.
22 #define ALIAS(old, new) \
23     new = old; \
24     .globl new
25 
26 #define WEAK_ALIAS(old, new) \
27     new = old; \
28     .weak new
29 
30 // See __asan_weak_alias in asan_impl.h.
31 #if __has_feature(address_sanitizer)
32 #define ASAN_WEAK_ALIAS(name) WEAK_ALIAS(name, __asan_##name)
33 #else // !__has_feature(address_sanitizer)
34 #define ASAN_WEAK_ALIAS(name) // Don't define __asan_##name.
35 #endif  // __has_feature(address_sanitizer)
36 
37 #ifdef __aarch64__
38 .macro push_regs reg1, reg2
39     stp \reg1, \reg2, [sp, #-16]!
40     .cfi_adjust_cfa_offset 16
41     .cfi_rel_offset \reg1, 0
42     .cfi_rel_offset \reg2, 8
43 .endm
44 .macro pop_regs reg1, reg2
45     ldp \reg1, \reg2, [sp], #16
46     .cfi_adjust_cfa_offset -16
47     .cfi_same_value \reg1
48     .cfi_same_value \reg2
49 .endm
50 #endif
51 
52 #ifdef __x86_64__
53 .macro push_reg reg
54     push \reg
55     .cfi_adjust_cfa_offset 8
56     .cfi_rel_offset \reg, 0
57 .endm
58 .macro pop_reg reg
59     pop \reg
60     .cfi_adjust_cfa_offset -8
61     .cfi_same_value \reg
62 .endm
63 #endif
64