__need macros for communication with compiler-provided headers

Message ID efe16d09-7557-3568-f80e-23f1abf5bfe2@mellanox.com
State New, archived
Headers

Commit Message

Chris Metcalf March 23, 2017, 3:38 p.m. UTC
  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
  

Patch

diff --git a/arch/tile/include/uapi/arch/abi.h b/arch/tile/include/uapi/arch/abi.h
index c55a3d432644..328e62260272 100644
--- a/arch/tile/include/uapi/arch/abi.h
+++ b/arch/tile/include/uapi/arch/abi.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. */
diff --git a/arch/tile/include/uapi/arch/intreg.h b/arch/tile/include/uapi/arch/intreg.h
new file mode 100644
index 000000000000..1cf2fbf74306
--- /dev/null
+++ b/arch/tile/include/uapi/arch/intreg.h
@@ -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__ */