1 // Copyright 2016 The Fuchsia Authors
2 // Copyright (c) 2008-2013 Travis Geiselbrecht
3 //
4 // Use of this source code is governed by a MIT-style
5 // license that can be found in the LICENSE file or at
6 // https://opensource.org/licenses/MIT
7 
8 #pragma once
9 
10 #ifndef __ASSEMBLER__
11 #error for assembly files only
12 #endif
13 
14 #include <arch/asm_macros.h>
15 
16 // for functions that don't have an "end" or don't want .cfi_startproc
17 #define LOCAL_FUNCTION_LABEL(x) .type x,STT_FUNC; x:
18 #define FUNCTION_LABEL(x) .global x; .hidden x; LOCAL_FUNCTION_LABEL(x)
19 
20 #define LOCAL_FUNCTION(x) LOCAL_FUNCTION_LABEL(x) .cfi_startproc
21 #define FUNCTION(x) .global x; .hidden x; LOCAL_FUNCTION(x)
22 
23 // for local or global functions
24 #define END_FUNCTION(x) .cfi_endproc; .size x, . - x
25 
26 #define LOCAL_DATA(x) .type x,STT_OBJECT; x:
27 #define DATA(x) .global x; .hidden x; LOCAL_DATA(x)
28 
29 // for local or global data
30 #define END_DATA(x) .size x, . - x
31 
32 // Some DWARF constants for CFI description.
33 #define DW_CFA_val_expression 0x16
34 #define DW_OP_lit0            0x30
35 
36 .macro cfi_register_is_zero reg
37     .cfi_escape DW_CFA_val_expression, \reg, 1, DW_OP_lit0
38 .endm
39 
40 // We want .debug_frame not .eh_frame.
41 // WARNING: This is a subtle side-effect of including this file. Heads up!
42 .cfi_sections .debug_frame
43