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; \
14name: \
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