1#----------------------------------------------------------------------------
2# Macros
3#----------------------------------------------------------------------------
4
5	mask = (1 << alignment) - 1
6
7	# Output VALUE as an unaligned pointer-sized quantity.
8	.macro pbyte value
9	.if alignment == 2
10	.4byte		\value
11	.else
12	.8byte		\value
13	.endif
14	.endm
15
16
17	# Start a new CIE, and emit everything up to the augmentation data.
18	# Use LABEL to mark the start of the entry and AUG as the augmentation
19	# string.
20	.macro start_cie label,aug
21	.section	.eh_frame,"aw",@progbits
22\label:
23	.word		2f-1f		# Length
241:
25	.word		0		# Identifier
26	.byte		1		# Version
27	.string		"\aug"		# Augmentation
28	.byte		1		# Code alignment
29	.byte		4		# Data alignment
30	.byte		31		# Return address column
31	.endm
32
33
34	# Create a dummy function of SIZE bytes in SECTION and emit the
35	# first four entries of an FDE for it.
36	.macro start_fde cie,section,size
37	.section	\section,"ax",@progbits
383:
39	.rept		\size / 4
40	nop
41	.endr
424:
43	.section	.eh_frame,"aw",@progbits
44	.word		2f-1f		# Length
451:
46	.word		.-\cie		# CIE offset
47	pbyte		3b		# Initial PC
48	pbyte		4b-3b		# Size of code
49	.endm
50
51
52	# Finish a CIE or FDE entry.
53	.macro end_entry
54	.p2align	alignment,fill
552:
56	.endm
57
58
59	# Start the augmentation data for a CIE that has a 'P' entry
60	# followed by EXTRA bytes.  AUGLEN is the length of augmentation
61	# string (including zero terminator), ENCODING is the encoding to
62	# use for the personality routine and VALUE is the value it
63	# should have.
64	.macro		persaug auglen,extra,encoding,value
65	.if (\encoding & 0xf0) == 0x50
66	.byte		(-(9 + \auglen + 3 + 2) & mask) + 2 + mask + \extra
67	.byte		\encoding
68	.fill		-(9 + \auglen + 3 + 2) & mask,1,0
69	.else
70	.byte		2 + mask + \extra
71	.byte		\encoding
72	.endif
73	pbyte		\value
74	.endm
75
76
77	.macro cie_basic label
78	start_cie	\label,""
79	end_entry
80	.endm
81
82	.macro fde_basic cie,section,size
83	start_fde	\cie,\section,\size
84	end_entry
85	.endm
86
87
88	.macro cie_zP label,encoding,value
89	start_cie	 \label,"zP"
90	persaug		3,0,\encoding,\value
91	end_entry
92	.endm
93
94	.macro fde_zP cie,section,size
95	start_fde	 \cie,\section,\size
96	.byte		 0		# Augmentation length
97	end_entry
98	.endm
99
100
101	.macro cie_zPR label,encoding,value
102	start_cie	 \label,"zPR"
103	persaug		4,1,\encoding,\value
104	.byte		0		# FDE enconding
105	end_entry
106	.endm
107
108	.macro fde_zPR cie,section,size
109	start_fde	\cie,\section,\size
110	.byte		0		# Augmentation length
111	end_entry
112	.endm
113
114#----------------------------------------------------------------------------
115# Test code
116#----------------------------------------------------------------------------
117
118	cie_basic	basic1
119	fde_basic	basic1,.text,0x10
120	fde_basic	basic1,.text,0x20
121
122	cie_basic	basic2
123	fde_basic	basic2,.text,0x30
124
125	cie_basic	basic3
126	fde_basic	basic3,.text,0x40
127
128	cie_basic	basic4
129	fde_basic	basic4,.text,0x50
130
131	cie_zP		zP_unalign1,0x00,foo
132	fde_zP		zP_unalign1,.text,0x10
133	fde_zP		zP_unalign1,.text,0x20
134
135	cie_zP		zP_align1,0x50,foo
136	fde_zP		zP_align1,.text,0x10
137	fde_zP		zP_align1,.text,0x20
138
139	cie_zPR		zPR1,0x00,foo
140	fde_zPR		zPR1,.text,0x10
141	fde_zPR		zPR1,.discard,0x20
142
143	cie_zPR		zPR2,0x00,foo
144	fde_zPR		zPR2,.text,0x30
145	fde_zPR		zPR2,.text,0x40
146
147	cie_basic	basic5
148	fde_basic	basic5,.text,0x10
149
150	.if alignment == 2
151	.section	.gcc_compiled_long32
152	.endif
153