__need macros for communication with compiler-provided headers
Commit Message
On 3/22/2017 2:47 PM, Zack Weinberg wrote:
> So my suggestion would be that you provide an uapi/arch/int_reg_t.h
> (or something like that; it doesn't matter what the name is) that
> _only_ defines int_reg_t (and names in the implementation namespace)
> and then the glibc headers that need int_reg_t can include that.
> You'll find, when you make this change, that arch/abi.h is suddenly
> quite a bit tidier.
>
> The catch though is that we do need a transition plan. I suspect it's
> not a big deal if old libc headers + new kernel headers start getting
> _all_ of arch/abi.h from the small number of headers that use the
> __need macro, so maybe it can be as simple as "as of version X.Y of
> glibc we require version A.B.C or later kernel headers for Tile."
My concern is that we don't want to screw up the namespace for anything
that includes <bits/link.h> or <bits/setjmp.h> due to getting all of <arch/abi.h>.
How does this change look to you?
Subject: [PATCH] tile: prefer <arch/intreg.h> to __need_int_reg_t
As part of some work in glibc to move away from the "__need"
prefix, this commit breaks away the definitions of __int_reg_t,
__uint_reg_t, and __INT_REG_FMT to a separate <arch/intreg.h>
"microheader". It is then included from <arch/abi.h> to preserve
the semantics of the previous header.
For now, we continue to preserve the __need_int_reg_t semantics
in <arch/abi.h> as well, but anticipate that after a few years
we can obsolete it.
---
arch/tile/include/uapi/arch/abi.h | 49 +++----------------------
arch/tile/include/uapi/arch/intreg.h | 70 ++++++++++++++++++++++++++++++++++++
2 files changed, 74 insertions(+), 45 deletions(-)
create mode 100644 arch/tile/include/uapi/arch/intreg.h
@@ -20,58 +20,17 @@
#ifndef __ARCH_ABI_H__
-#if !defined __need_int_reg_t && !defined __DOXYGEN__
-# define __ARCH_ABI_H__
-# include <arch/chip.h>
-#endif
-
-/* Provide the basic machine types. */
-#ifndef __INT_REG_BITS
-
-/** Number of bits in a register. */
-#if defined __tilegx__
-# define __INT_REG_BITS 64
-#elif defined __tilepro__
-# define __INT_REG_BITS 32
-#elif !defined __need_int_reg_t
+#ifndef __tile__ /* support uncommon use of arch headers in non-tile builds */
# include <arch/chip.h>
# define __INT_REG_BITS CHIP_WORD_SIZE()
-#else
-# error Unrecognized architecture with __need_int_reg_t
-#endif
-
-#if __INT_REG_BITS == 64
-
-#ifndef __ASSEMBLER__
-/** Unsigned type that can hold a register. */
-typedef unsigned long long __uint_reg_t;
-
-/** Signed type that can hold a register. */
-typedef long long __int_reg_t;
-#endif
-
-/** String prefix to use for printf(). */
-#define __INT_REG_FMT "ll"
-
-#else
-
-#ifndef __ASSEMBLER__
-/** Unsigned type that can hold a register. */
-typedef unsigned long __uint_reg_t;
-
-/** Signed type that can hold a register. */
-typedef long __int_reg_t;
-#endif
-
-/** String prefix to use for printf(). */
-#define __INT_REG_FMT "l"
-
#endif
-#endif /* __INT_REG_BITS */
+#include <arch/intreg.h>
+/* __need_int_reg_t is deprecated: just include <arch/intreg.h> */
#ifndef __need_int_reg_t
+#define __ARCH_ABI_H__
#ifndef __ASSEMBLER__
/** Unsigned type that can hold a register. */
new file mode 100644
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017 Tilera Corporation. All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation, version 2.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, GOOD TITLE or
+ * NON INFRINGEMENT. See the GNU General Public License for
+ * more details.
+ */
+
+/**
+ * @file
+ *
+ * Provide types and defines for the type that can hold a register,
+ * in the implementation namespace.
+ */
+
+#ifndef __ARCH_INTREG_H__
+#define __ARCH_INTREG_H__
+
+/*
+ * Get number of bits in a register. __INT_REG_BITS may be defined
+ * prior to including this header to force a particular bit width.
+ */
+
+#ifndef __INT_REG_BITS
+# if defined __tilegx__
+# define __INT_REG_BITS 64
+# elif defined __tilepro__
+# define __INT_REG_BITS 32
+# else
+# error Unrecognized architecture
+# endif
+#endif
+
+#if __INT_REG_BITS == 64
+
+# ifndef __ASSEMBLER__
+/** Unsigned type that can hold a register. */
+typedef unsigned long long __uint_reg_t;
+
+/** Signed type that can hold a register. */
+typedef long long __int_reg_t;
+# endif
+
+/** String prefix to use for printf(). */
+# define __INT_REG_FMT "ll"
+
+#elif __INT_REG_BITS == 32
+
+# ifndef __ASSEMBLER__
+/** Unsigned type that can hold a register. */
+typedef unsigned long __uint_reg_t;
+
+/** Signed type that can hold a register. */
+typedef long __int_reg_t;
+# endif
+
+/** String prefix to use for printf(). */
+# define __INT_REG_FMT "l"
+
+#else
+# error Unrecognized value of __INT_REG_BITS
+#endif
+
+#endif /* !__ARCH_INTREG_H__ */