]> git.ipfire.org Git - thirdparty/ipxe.git/commitdiff
[build] Allow for per-architecture unprefixed constant operand modifier
authorMichael Brown <mcb30@ipxe.org>
Sun, 5 Feb 2023 23:55:14 +0000 (23:55 +0000)
committerMichael Brown <mcb30@ipxe.org>
Sun, 5 Feb 2023 23:55:14 +0000 (23:55 +0000)
Over the years, the undocumented operand modifier used to produce the
unprefixed constant values in __einfo_error() has varied from "%c0" to
"%a0" in commit 1a77466 ("[build] Fix use of inline assembly on GCC
4.8 ARM64 builds") and back to "%c0" in commit 3fb3ffc ("[build] Fix
use of inline assembly on GCC 8 ARM64 builds"), according to the
evolving demands of the toolchain.

LoongArch64 suffers from a similar issue: GCC 13 will allow either,
but the currently released GCC 12 allows only the "%a0" form.

Introduce a macro ASM_NO_PREFIX, defined in bits/compiler.h, to
abstract away this difference and allow different architectures to use
different operand modifiers.

Signed-off-by: Michael Brown <mcb30@ipxe.org>
src/arch/arm32/include/bits/compiler.h
src/arch/arm64/include/bits/compiler.h
src/arch/i386/include/bits/compiler.h
src/arch/x86_64/include/bits/compiler.h
src/include/errno.h

index e420cf922238024b2087177f86110840fc5b00ea..e119f044554b3821fb4105131d6240232fffc3fd 100644 (file)
@@ -8,6 +8,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #ifndef ASSEMBLY
 
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
 #define __asmcall
 #define __libgcc
 
index 3b129c2fdff7ad63392073ebb862852d9328d8f1..b3e1b30a5721e709e11a55d9078a0af123f71fa1 100644 (file)
@@ -8,6 +8,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #ifndef ASSEMBLY
 
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
 #define __asmcall
 #define __libgcc
 
index 87201135f78cfe10a21ec91aa73c05df7a7e87b5..78c600428ebc023e8608643e6c524ac2f4c4cef7 100644 (file)
@@ -8,6 +8,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #ifndef ASSEMBLY
 
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
 /** Declare a function with standard calling conventions */
 #define __asmcall __attribute__ (( cdecl, regparm(0) ))
 
index 5129f90d0f9561acd417a56f2116f04470e948c6..1c04a7b30829399e89b93365f9184dc0d000e28e 100644 (file)
@@ -8,6 +8,9 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
 
 #ifndef ASSEMBLY
 
+/** Unprefixed constant operand modifier */
+#define ASM_NO_PREFIX "c"
+
 /** Declare a function with standard calling conventions */
 #define __asmcall __attribute__ (( regparm(0) ))
 
index decde38edcadba329e2b44cf5203d7e55cca3998..ac012a6917157219893173ebdfabf62f023ffd38 100644 (file)
@@ -262,10 +262,10 @@ static inline void eplatform_discard ( int dummy __unused, ... ) {}
                  ".balign 8\n\t"                                       \
                  "\n1:\n\t"                                            \
                  ".long ( 4f - 1b )\n\t"                               \
-                 ".long %c0\n\t"                                       \
+                 ".long %" ASM_NO_PREFIX "0\n\t"                       \
                  ".long ( 2f - 1b )\n\t"                               \
                  ".long ( 3f - 1b )\n\t"                               \
-                 ".long %c1\n\t"                                       \
+                 ".long %" ASM_NO_PREFIX "1\n\t"                       \
                  "\n2:\t.asciz \"" __einfo_desc ( einfo ) "\"\n\t"     \
                  "\n3:\t.asciz \"" __FILE__ "\"\n\t"                   \
                  ".balign 8\n\t"                                       \