Re: [PATCH/libiberty] fix build of gdb/binutils with clang.

2015-05-18 Thread Yunlian Jiang
Yes, the problem is  libiberty is compiling some files
with _GNU_SOURCE defined and some not. So the configure
file does not include "#define _GNU_SOURCE".

I have reduced the failing compiling as below.

#define _GNU_SOURCE  (1)
#define ATTRIBUTE_NONNULL(m) __attribute__ ((__nonnull__ (m)))
#define ATTRIBUTE_PRINTF(m, n) __attribute__ ((__format__ (__printf__,
m, n))) ATTRIBUTE_NONNULL(m)
#define ATTRIBUTE_PRINTF_2 ATTRIBUTE_PRINTF(2, 3)
#include 
//#define _GNU_SOURCE //   (2)
extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;

it fails with command line
/usr/bin/clang -fPIE -D_FORTIFY_SOURCE=2 -O2 -c f.c -o f.o

If the _GNU_SOURCE is placed at (1), then the asprintf in the test
case is a macro and it is expanded to

extern int __asprintf_chk (char **, 2 - 1, const char *, ...)
__attribute__ ((__format__ (__printf__, 2, 3))) __attribute__
((__nonnull__ (2)));

in the pre-processed file and causes compilation error.

If the  _GNU_SOURCE is placed at (2) or after stdio.h, then asprintf
in the test case
is still a function in the pre-processed file and it compiles.
extern int asprintf (char **, const char *, ...) __attribute__
((__format__ (__printf__, 2, 3))) __attribute__ ((__nonnull__ (2)));


I then looked at the /usr/include/bits/stdio2.h,  it has
# ifdef __USE_GNU
...
#  ifdef __va_arg_pack
__fortify_function int
__NTH (asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...))
{
  return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt,
 __va_arg_pack ());
}

__fortify_function int
__NTH (__asprintf (char **__restrict __ptr, const char *__restrict __fmt,
   ...))
{
  return __asprintf_chk (__ptr, __USE_FORTIFY_LEVEL - 1, __fmt,
 __va_arg_pack ());
}

__fortify_function int
__NTH (obstack_printf (struct obstack *__restrict __obstack,
   const char *__restrict __fmt, ...))
{
  return __obstack_printf_chk (__obstack, __USE_FORTIFY_LEVEL - 1, __fmt,
   __va_arg_pack ());
}
#  elif !defined __cplusplus
#   define asprintf(ptr, ...) \
  __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
#   define __asprintf(ptr, ...) \
  __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
#   define obstack_printf(obstack, ...) \
  __obstack_printf_chk (obstack, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
#  endif
# endif

It requires gcc to be at least 4.3 to have __va_arg_pack defined.
Clang only has gcc 4.2. So clang chooses
the asprintf macro and causes the problem.

On Mon, May 4, 2015 at 5:30 PM, Ian Lance Taylor  wrote:
> On Mon, May 4, 2015 at 3:49 PM, Yunlian Jiang  wrote:
>> There was a similar disscussion here
>> https://gcc.gnu.org/ml/gcc/2005-11/msg01190.html
>
> That was a discussion about libiberty.  Your subject says you have
> trouble building gdb.
>
> Can you describe the exact problem that you are having?  What
> precisely are you doing?  What precisely happens?
>
>
>> The problem is in the configure stage, the __GNU_SOURCE is not
>> defined, and it could not find
>> the declaration of asprintf. so it make a declaration of asprintf in
>> libiberty.h. And  for the file floatformat.c,
>> the  __GNU_SOURCE is defined, so it could find another asprintf in
>> /usr/include/bits/stdio2.h, it also includes
>> libiberty.h. So these two asprintf conflicts when __USE_FORTIFY_LEVEL is set.
>
> I think the basic guideline should be that HAVE_DECL_ASPRINTF should
> be correct.  If libiberty compiled with _GNU_SOURCE defined, then it
> should test HAVE_DECL_ASPRINTF with _GNU_SOURCE defined.  If not, then
> not.  So perhaps the problem is that libiberty is compiling some files
> with _GNU_SOURCE defined and some not.
>
> Ian


Re: [PATCH/libiberty] fix build of gdb/binutils with clang.

2015-05-19 Thread Yunlian Jiang
I could do that and it make the compilation of libiberty passes.
However, I  have some other problem when using clang to build gdb
because of libiberty.

Some c file from other component may include 'libiberty.h' which contains
the following

#if !HAVE_DECL_ASPRINTF
/* Like sprintf but provides a pointer to malloc'd storage, which must
   be freed by the caller.  */

extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
#endif

The HAVE_DECL_ASPRINTF is defined in config.h under libiberty directory.
If the other c file only includes libiberty.h and does not include the
libiberty/config.h and
at the same time, _GNU_SOURCE is defind, the same error happens.


On Mon, May 18, 2015 at 4:52 PM, Ian Lance Taylor  wrote:
> On Mon, May 18, 2015 at 4:26 PM, Yunlian Jiang  wrote:
>>
>> Yes, the problem is  libiberty is compiling some files
>> with _GNU_SOURCE defined and some not. So the configure
>> file does not include "#define _GNU_SOURCE".
>
> As far as I can see it should be fine to define _GNU_SOURCE when
> compiling all libiberty files.
>
> Ian


Re: [PATCH/libiberty] fix build of gdb/binutils with clang.

2015-05-20 Thread Yunlian Jiang
I have the following change to make libiberty compile with _GNU_SOURCE defined
and remove the declaration of asprintf in libiberty.h if
HAVE_DECL_ASPRINTF is not
defined.

diff --git a/include/libiberty.h b/include/libiberty.h
index b33dd65..8e096a0 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -621,7 +621,7 @@ extern int pexecute (const char *, char * const *,
const char *,

 extern int pwait (int, int *, int);

-#if !HAVE_DECL_ASPRINTF
+#if defined(HAVE_DECL_ASPRINTF) && !HAVE_DECL_ASPRINTF
 /* Like sprintf but provides a pointer to malloc'd storage, which must
be freed by the caller.  */

diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in
index f06cc69..624420d 100644
--- a/libiberty/Makefile.in
+++ b/libiberty/Makefile.in
@@ -113,7 +113,8 @@ installcheck: installcheck-subdir

 INCDIR=$(srcdir)/$(MULTISRCTOP)../include

-COMPILE.c = $(CC) -c @DEFS@ $(CFLAGS) $(CPPFLAGS) -I. -I$(INCDIR)
$(HDEFINES) @ac_libiberty_warn_cflags@
+COMPILE.c = $(CC) -c @DEFS@ $(CFLAGS) $(CPPFLAGS) -I. -I$(INCDIR) \
+   $(HDEFINES) @ac_libiberty_warn_cflags@ -D_GNU_SOURCE

 # Just to make sure we don't use a built-in rule with VPATH
 .c.$(objext):
diff --git a/libiberty/configure b/libiberty/configure
index b06cab2..c6758b0 100755
--- a/libiberty/configure
+++ b/libiberty/configure
@@ -5130,6 +5130,9 @@ $as_echo "#define NEED_DECLARATION_ERRNO 1" >>confdefs.h
 fi


+$as_echo "#define _GNU_SOURCE 1" >>confdefs.h
+
+
 # Determine sizes of some types.
 # The cast to long int works around a bug in the HP C Compiler
 # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
diff --git a/libiberty/configure.ac b/libiberty/configure.ac
index 922aa86..9f2d661 100644
--- a/libiberty/configure.ac
+++ b/libiberty/configure.ac
@@ -272,6 +272,8 @@ AC_HEADER_TIME

 libiberty_AC_DECLARE_ERRNO

+AC_DEFINE(_GNU_SOURCE)
+
 # Determine sizes of some types.
 AC_CHECK_SIZEOF([int])
 AC_CHECK_SIZEOF([long])
diff --git a/libiberty/floatformat.c b/libiberty/floatformat.c
index 789fa05..4e73a2d 100644
--- a/libiberty/floatformat.c
+++ b/libiberty/floatformat.c
@@ -19,7 +19,9 @@ along with this program; if not, write to the Free Software
 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
02110-1301, USA.  */

 /* This is needed to pick up the NAN macro on some systems.  */
+#ifndef _GNU_SOURCE
 #define _GNU_SOURCE
+#endif

 #ifdef HAVE_CONFIG_H
 #include "config.h"

On Tue, May 19, 2015 at 11:15 AM, Ian Lance Taylor  wrote:
> On Tue, May 19, 2015 at 11:08 AM, Yunlian Jiang  wrote:
>>
>> I could do that and it make the compilation of libiberty passes.
>> However, I  have some other problem when using clang to build gdb
>> because of libiberty.
>>
>> Some c file from other component may include 'libiberty.h' which contains
>> the following
>>
>> #if !HAVE_DECL_ASPRINTF
>> /* Like sprintf but provides a pointer to malloc'd storage, which must
>>be freed by the caller.  */
>>
>> extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
>> #endif
>>
>> The HAVE_DECL_ASPRINTF is defined in config.h under libiberty directory.
>> If the other c file only includes libiberty.h and does not include the
>> libiberty/config.h and
>> at the same time, _GNU_SOURCE is defind, the same error happens.
>
> Probably if HAVE_DECL_ASPRINTF is not defined at all, we should not
> declare asprintf in libiberty.h.
>
> Ian


Re: [PATCH/libiberty] fix build of gdb/binutils with clang.

2015-05-20 Thread Yunlian Jiang
GCC bootstraps with this patch.

On Wed, May 20, 2015 at 12:54 PM, Ian Lance Taylor  wrote:
> This is OK if GCC bootstraps.
>
> Thanks.
>
> Ian
>
> On Wed, May 20, 2015 at 11:25 AM, Yunlian Jiang  wrote:
>> I have the following change to make libiberty compile with _GNU_SOURCE 
>> defined
>> and remove the declaration of asprintf in libiberty.h if
>> HAVE_DECL_ASPRINTF is not
>> defined.
>>
>> diff --git a/include/libiberty.h b/include/libiberty.h
>> index b33dd65..8e096a0 100644
>> --- a/include/libiberty.h
>> +++ b/include/libiberty.h
>> @@ -621,7 +621,7 @@ extern int pexecute (const char *, char * const *,
>> const char *,
>>
>>  extern int pwait (int, int *, int);
>>
>> -#if !HAVE_DECL_ASPRINTF
>> +#if defined(HAVE_DECL_ASPRINTF) && !HAVE_DECL_ASPRINTF
>>  /* Like sprintf but provides a pointer to malloc'd storage, which must
>> be freed by the caller.  */
>>
>> diff --git a/libiberty/Makefile.in b/libiberty/Makefile.in
>> index f06cc69..624420d 100644
>> --- a/libiberty/Makefile.in
>> +++ b/libiberty/Makefile.in
>> @@ -113,7 +113,8 @@ installcheck: installcheck-subdir
>>
>>  INCDIR=$(srcdir)/$(MULTISRCTOP)../include
>>
>> -COMPILE.c = $(CC) -c @DEFS@ $(CFLAGS) $(CPPFLAGS) -I. -I$(INCDIR)
>> $(HDEFINES) @ac_libiberty_warn_cflags@
>> +COMPILE.c = $(CC) -c @DEFS@ $(CFLAGS) $(CPPFLAGS) -I. -I$(INCDIR) \
>> +   $(HDEFINES) @ac_libiberty_warn_cflags@ -D_GNU_SOURCE
>>
>>  # Just to make sure we don't use a built-in rule with VPATH
>>  .c.$(objext):
>> diff --git a/libiberty/configure b/libiberty/configure
>> index b06cab2..c6758b0 100755
>> --- a/libiberty/configure
>> +++ b/libiberty/configure
>> @@ -5130,6 +5130,9 @@ $as_echo "#define NEED_DECLARATION_ERRNO 1" 
>> >>confdefs.h
>>  fi
>>
>>
>> +$as_echo "#define _GNU_SOURCE 1" >>confdefs.h
>> +
>> +
>>  # Determine sizes of some types.
>>  # The cast to long int works around a bug in the HP C Compiler
>>  # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects
>> diff --git a/libiberty/configure.ac b/libiberty/configure.ac
>> index 922aa86..9f2d661 100644
>> --- a/libiberty/configure.ac
>> +++ b/libiberty/configure.ac
>> @@ -272,6 +272,8 @@ AC_HEADER_TIME
>>
>>  libiberty_AC_DECLARE_ERRNO
>>
>> +AC_DEFINE(_GNU_SOURCE)
>> +
>>  # Determine sizes of some types.
>>  AC_CHECK_SIZEOF([int])
>>  AC_CHECK_SIZEOF([long])
>> diff --git a/libiberty/floatformat.c b/libiberty/floatformat.c
>> index 789fa05..4e73a2d 100644
>> --- a/libiberty/floatformat.c
>> +++ b/libiberty/floatformat.c
>> @@ -19,7 +19,9 @@ along with this program; if not, write to the Free Software
>>  Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
>> 02110-1301, USA.  */
>>
>>  /* This is needed to pick up the NAN macro on some systems.  */
>> +#ifndef _GNU_SOURCE
>>  #define _GNU_SOURCE
>> +#endif
>>
>>  #ifdef HAVE_CONFIG_H
>>  #include "config.h"
>>
>> On Tue, May 19, 2015 at 11:15 AM, Ian Lance Taylor  wrote:
>>> On Tue, May 19, 2015 at 11:08 AM, Yunlian Jiang  wrote:
>>>>
>>>> I could do that and it make the compilation of libiberty passes.
>>>> However, I  have some other problem when using clang to build gdb
>>>> because of libiberty.
>>>>
>>>> Some c file from other component may include 'libiberty.h' which contains
>>>> the following
>>>>
>>>> #if !HAVE_DECL_ASPRINTF
>>>> /* Like sprintf but provides a pointer to malloc'd storage, which must
>>>>be freed by the caller.  */
>>>>
>>>> extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
>>>> #endif
>>>>
>>>> The HAVE_DECL_ASPRINTF is defined in config.h under libiberty directory.
>>>> If the other c file only includes libiberty.h and does not include the
>>>> libiberty/config.h and
>>>> at the same time, _GNU_SOURCE is defind, the same error happens.
>>>
>>> Probably if HAVE_DECL_ASPRINTF is not defined at all, we should not
>>> declare asprintf in libiberty.h.
>>>
>>> Ian


[PATCH/libiberty] fix build of gdb/binutils with clang.

2015-04-28 Thread Yunlian Jiang
I believe this is the same problem as
https://gcc.gnu.org/ml/gcc-patches/2008-07/msg00292.html

The asprinf declaration is  messed up when using clang to build gdb.

diff --git a/include/libiberty.h b/include/libiberty.h
index b33dd65..a294903 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -625,8 +625,10 @@ extern int pwait (int, int *, int);
 /* Like sprintf but provides a pointer to malloc'd storage, which must
be freed by the caller.  */

+#ifndef asprintf
 extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
 #endif
+#endif

 /* Like asprintf but allocates memory without fail. This works like
xmalloc.  */


Re: [PATCH/libiberty] fix build of gdb/binutils with clang.

2015-05-01 Thread Yunlian Jiang
The test case does not have #define _GNU_SOURCE, so it says
error: ‘asprintf’ undeclared (first use in this function)

On Fri, May 1, 2015 at 3:45 PM, Ian Lance Taylor  wrote:
> On Tue, Apr 28, 2015 at 2:59 PM, Yunlian Jiang  wrote:
>> I believe this is the same problem as
>> https://gcc.gnu.org/ml/gcc-patches/2008-07/msg00292.html
>>
>> The asprinf declaration is  messed up when using clang to build gdb.
>>
>> diff --git a/include/libiberty.h b/include/libiberty.h
>> index b33dd65..a294903 100644
>> --- a/include/libiberty.h
>> +++ b/include/libiberty.h
>> @@ -625,8 +625,10 @@ extern int pwait (int, int *, int);
>>  /* Like sprintf but provides a pointer to malloc'd storage, which must
>> be freed by the caller.  */
>>
>> +#ifndef asprintf
>>  extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
>>  #endif
>> +#endif
>>
>>  /* Like asprintf but allocates memory without fail. This works like
>> xmalloc.  */
>
> Why is HAVE_DECL_ASPRINTF not defined?
>
> Ian


Re: [PATCH/libiberty] fix build of gdb/binutils with clang.

2015-05-04 Thread Yunlian Jiang
There was a similar disscussion here
https://gcc.gnu.org/ml/gcc/2005-11/msg01190.html

The problem is in the configure stage, the __GNU_SOURCE is not
defined, and it could not find
the declaration of asprintf. so it make a declaration of asprintf in
libiberty.h. And  for the file floatformat.c,
the  __GNU_SOURCE is defined, so it could find another asprintf in
/usr/include/bits/stdio2.h, it also includes
libiberty.h. So these two asprintf conflicts when __USE_FORTIFY_LEVEL is set.

On Sat, May 2, 2015 at 11:58 AM, Ian Lance Taylor  wrote:
> On Fri, May 1, 2015 at 4:45 PM, Yunlian Jiang  wrote:
>> The test case does not have #define _GNU_SOURCE, so it says
>> error: ‘asprintf’ undeclared (first use in this function)
>
> OK, then my next question is: why does the test case (I assume you
> mean the test case for whether to set HAVE_DECL_ASPRINTF) not have
> #define _GNU_SOURCE?
>
> What is the background here?
>
> Ian
>
>> On Fri, May 1, 2015 at 3:45 PM, Ian Lance Taylor  wrote:
>>> On Tue, Apr 28, 2015 at 2:59 PM, Yunlian Jiang  wrote:
>>>> I believe this is the same problem as
>>>> https://gcc.gnu.org/ml/gcc-patches/2008-07/msg00292.html
>>>>
>>>> The asprinf declaration is  messed up when using clang to build gdb.
>>>>
>>>> diff --git a/include/libiberty.h b/include/libiberty.h
>>>> index b33dd65..a294903 100644
>>>> --- a/include/libiberty.h
>>>> +++ b/include/libiberty.h
>>>> @@ -625,8 +625,10 @@ extern int pwait (int, int *, int);
>>>>  /* Like sprintf but provides a pointer to malloc'd storage, which must
>>>> be freed by the caller.  */
>>>>
>>>> +#ifndef asprintf
>>>>  extern int asprintf (char **, const char *, ...) ATTRIBUTE_PRINTF_2;
>>>>  #endif
>>>> +#endif
>>>>
>>>>  /* Like asprintf but allocates memory without fail. This works like
>>>> xmalloc.  */
>>>
>>> Why is HAVE_DECL_ASPRINTF not defined?
>>>
>>> Ian