VirtualBox

source: vbox/trunk/include/iprt/asmdefs-arm.h@ 104212

Last change on this file since 104212 was 100276, checked in by vboxsync, 17 months ago

iprt/asmdefs-arm.h,Config.kmk: Use ASM_FORMAT_ELF and ASM_FORMAT_MACHO to in asmdefs-arm.h to determin how to start sections. bugref:10457

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 4.3 KB
Line 
1/** @file
2 * IPRT - ARM Specific Assembly Macros.
3 */
4
5/*
6 * Copyright (C) 2023 Oracle and/or its affiliates.
7 *
8 * This file is part of VirtualBox base platform packages, as
9 * available from https://www.virtualbox.org.
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation, in version 3 of the
14 * License.
15 *
16 * This program is distributed in the hope that it will be useful, but
17 * WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * General Public License for more details.
20 *
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, see <https://www.gnu.org/licenses>.
23 *
24 * The contents of this file may alternatively be used under the terms
25 * of the Common Development and Distribution License Version 1.0
26 * (CDDL), a copy of it is provided in the "COPYING.CDDL" file included
27 * in the VirtualBox distribution, in which case the provisions of the
28 * CDDL are applicable instead of those of the GPL.
29 *
30 * You may elect to license modified versions of this file under the
31 * terms and conditions of either the GPL or the CDDL or both.
32 *
33 * SPDX-License-Identifier: GPL-3.0-only OR CDDL-1.0
34 */
35
36#ifndef IPRT_INCLUDED_asmdefs_arm_h
37#define IPRT_INCLUDED_asmdefs_arm_h
38#ifndef RT_WITHOUT_PRAGMA_ONCE
39# pragma once
40#endif
41
42#if !defined(RT_ARCH_ARM64) && !defined(RT_ARCH_ARM32)
43# error "Not on ARM64 or ARM32"
44#endif
45
46/** @defgroup grp_rt_asmdefs_arm ARM Specific ASM (Clang and gcc) Macros
47 * @ingroup grp_rt_asm
48 * @{
49 */
50
51/** Marks the beginning of a code section. */
52#ifdef ASM_FORMAT_MACHO
53# define BEGINCODE .section __TEXT,__text,regular,pure_instructions
54#elif defined(ASM_FORMAT_ELF)
55# define BEGINCODE .section .text
56#else
57# error "Port me!"
58#endif
59
60/** Marks the end of a code section. */
61#if ASM_FORMAT_MACHO
62# define ENDCODE
63#elif defined(ASM_FORMAT_ELF)
64# define ENDCODE
65#else
66# error "Port me!"
67#endif
68
69
70/** Marks the beginning of a data section. */
71#if ASM_FORMAT_MACHO
72# define BEGINDATA .section __DATA,__data
73#elif defined(ASM_FORMAT_ELF)
74# define BEGINDATA .section .data
75#else
76# error "Port me!"
77#endif
78
79/** Marks the end of a data section. */
80#if ASM_FORMAT_MACHO
81# define ENDDATA
82#elif defined(ASM_FORMAT_ELF)
83# define ENDDATA
84#else
85# error "Port me!"
86#endif
87
88
89/** Marks the beginning of a readonly data section. */
90#if ASM_FORMAT_MACHO
91# define BEGINCONST .section __RODATA,__rodata
92#elif defined(ASM_FORMAT_ELF)
93# define BEGINCONST .section .rodata
94#else
95# error "Port me!"
96#endif
97
98/** Marks the end of a readonly data section. */
99#if ASM_FORMAT_MACHO
100# define ENDCONST
101#elif defined(ASM_FORMAT_ELF)
102# define ENDCONST
103#else
104# error "Port me!"
105#endif
106
107
108/** Marks the beginning of a readonly C strings section. */
109#if ASM_FORMAT_MACHO
110# define BEGINCONSTSTRINGS .section __TEXT,__cstring,cstring_literals
111#elif defined(ASM_FORMAT_ELF)
112# define BEGINCONSTSTRINGS .section .rodata
113#else
114# error "Port me!"
115#endif
116
117/** Marks the end of a readonly C strings section. */
118#if ASM_FORMAT_MACHO
119# define ENDCONSTSTRINGS
120#elif defined(ASM_FORMAT_ELF)
121# define ENDCONSTSTRINGS
122#else
123# error "Port me!"
124#endif
125
126
127/**
128 * Mangles the name so it can be referenced using DECLASM() in the C/C++ world.
129 *
130 * @returns a_SymbolC with the necessary prefix/postfix.
131 * @param a_SymbolC A C symbol name to mangle as needed.
132 */
133#if defined(RT_OS_DARWIN)
134# define NAME(a_SymbolC) _ ## a_SymbolC
135#else
136# define NAME(a_SymbolC) a_SymbolC
137#endif
138
139/**
140 * Returns the page address of the given symbol (used with the adrp instruction primarily).
141 *
142 * @returns Page aligned address of the given symbol
143 * @param a_Symbol The symbol to get the page address from.
144 */
145#if defined(__clang__)
146# define PAGE(a_Symbol) a_Symbol ## @PAGE
147#elif defined(__GNUC__)
148# define PAGE(a_Symbol) a_Symbol
149#else
150# error "Port me!"
151#endif
152
153/**
154 * Returns the offset inside the page of the given symbol.
155 *
156 * @returns Page offset of the given symbol inside a page.
157 * @param a_Symbol The symbol to get the page offset from.
158 */
159#if defined(__clang__)
160# define PAGEOFF(a_Symbol) a_Symbol ## @PAGEOFF
161#elif defined(__GNUC__)
162# define PAGEOFF(a_Symbol) :lo12: ## a_Symbol
163#else
164# error "Port me!"
165#endif
166
167
168/** @} */
169
170#endif /* !IPRT_INCLUDED_asmdefs_arm_h */
171
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette