Compare commits
8 Commits
master
...
build_werr
Author | SHA1 | Date |
---|---|---|
Lasse Collin | 109cddca95 | |
Lasse Collin | 1cd2790ff4 | |
Lasse Collin | 34aa4725ed | |
Lasse Collin | 4a1ef58ae7 | |
Lasse Collin | 146664519f | |
Lasse Collin | 8a8b8042e7 | |
Lasse Collin | ab2e9be00a | |
Lasse Collin | a9a5174852 |
|
@ -53,6 +53,7 @@ include(CheckSymbolExists)
|
||||||
include(CheckStructHasMember)
|
include(CheckStructHasMember)
|
||||||
include(CheckCSourceCompiles)
|
include(CheckCSourceCompiles)
|
||||||
include(cmake/tuklib_integer.cmake)
|
include(cmake/tuklib_integer.cmake)
|
||||||
|
include(cmake/tuklib_gnu_c_attributes.cmake)
|
||||||
include(cmake/tuklib_cpucores.cmake)
|
include(cmake/tuklib_cpucores.cmake)
|
||||||
include(cmake/tuklib_physmem.cmake)
|
include(cmake/tuklib_physmem.cmake)
|
||||||
include(cmake/tuklib_progname.cmake)
|
include(cmake/tuklib_progname.cmake)
|
||||||
|
@ -750,17 +751,7 @@ if(NOT TUKLIB_CPUCORES_FOUND OR NOT TUKLIB_PHYSMEM_FOUND)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Check for __attribute__((__constructor__)) support.
|
# Check for __attribute__((__constructor__)) support.
|
||||||
# This needs -Werror because some compilers just warn
|
tuklib_check_func_attribute_constructor(HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR)
|
||||||
# about this being unsupported.
|
|
||||||
cmake_push_check_state()
|
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
|
||||||
check_c_source_compiles("
|
|
||||||
__attribute__((__constructor__))
|
|
||||||
static void my_constructor_func(void) { return; }
|
|
||||||
int main(void) { return 0; }
|
|
||||||
"
|
|
||||||
HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR)
|
|
||||||
cmake_pop_check_state()
|
|
||||||
tuklib_add_definition_if(liblzma HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR)
|
tuklib_add_definition_if(liblzma HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR)
|
||||||
|
|
||||||
# The Win95 threading lacks a thread-safe one-time initialization function.
|
# The Win95 threading lacks a thread-safe one-time initialization function.
|
||||||
|
@ -782,25 +773,7 @@ option(ALLOW_ATTR_IFUNC "Allow use of __attribute__((__ifunc__())) if \
|
||||||
supported by the system" ON)
|
supported by the system" ON)
|
||||||
|
|
||||||
if(ALLOW_ATTR_IFUNC)
|
if(ALLOW_ATTR_IFUNC)
|
||||||
cmake_push_check_state()
|
tuklib_check_func_attribute_ifunc(HAVE_FUNC_ATTRIBUTE_IFUNC)
|
||||||
set(CMAKE_REQUIRED_FLAGS "-Werror")
|
|
||||||
check_c_source_compiles("
|
|
||||||
static void func(void) { return; }
|
|
||||||
static void (*resolve_func(void)) (void) { return func; }
|
|
||||||
void func_ifunc(void)
|
|
||||||
__attribute__((__ifunc__(\"resolve_func\")));
|
|
||||||
int main(void) { return 0; }
|
|
||||||
/*
|
|
||||||
* 'clang -Wall' incorrectly warns that resolve_func is
|
|
||||||
* unused (-Wunused-function). Correct assembly output is
|
|
||||||
* still produced. This problem exists at least in Clang
|
|
||||||
* versions 4 to 17. The following silences the bogus warning:
|
|
||||||
*/
|
|
||||||
void make_clang_quiet(void);
|
|
||||||
void make_clang_quiet(void) { resolve_func()(); }
|
|
||||||
"
|
|
||||||
HAVE_FUNC_ATTRIBUTE_IFUNC)
|
|
||||||
cmake_pop_check_state()
|
|
||||||
tuklib_add_definition_if(liblzma HAVE_FUNC_ATTRIBUTE_IFUNC)
|
tuklib_add_definition_if(liblzma HAVE_FUNC_ATTRIBUTE_IFUNC)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
@ -856,10 +829,28 @@ calculation if supported by the system" ON)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# Support -fvisiblity=hidden when building shared liblzma.
|
# Check for __attribute__((__always_inline__)) support.
|
||||||
# These lines do nothing on Windows (even under Cygwin).
|
tuklib_check_func_attribute_always_inline(HAVE_FUNC_ATTRIBUTE_ALWAYS_INLINE)
|
||||||
# HAVE_VISIBILITY should always be defined to 0 or 1.
|
tuklib_add_definition_if(liblzma HAVE_FUNC_ATTRIBUTE_ALWAYS_INLINE)
|
||||||
if(BUILD_SHARED_LIBS)
|
|
||||||
|
# Symbol visibility support:
|
||||||
|
#
|
||||||
|
# The C_VISIBILITY_PRESET property takes care of adding the compiler
|
||||||
|
# option -fvisibility=hidden (or equivalent) if and only if it is supported.
|
||||||
|
#
|
||||||
|
# HAVE_VISIBILITY indicates if __attribute__((__visibility__("default")))
|
||||||
|
# is supported. HAVE_VISIBILITY is ignored on Windows and Cygwin in
|
||||||
|
# the C code so we don't need to handle that here. HAVE_VISIBILITY
|
||||||
|
# should always be defined to 0 or 1.
|
||||||
|
#
|
||||||
|
# CMake's GenerateExportHeader module is too fancy since liblzma already
|
||||||
|
# has the necessary macros. Instead, check CMake's internal variable
|
||||||
|
# CMAKE_C_COMPILE_OPTIONS_VISIBILITY (it's the C-specific variant of
|
||||||
|
# CMAKE_<LANG>_COMPILE_OPTIONS_VISIBILITY) which contains the compiler
|
||||||
|
# command line option for visibility support. It's empty or unset when
|
||||||
|
# visibility isn't supported. It was added to CMake 2.8.12 in the commit
|
||||||
|
# 0e9f4bc00c6b26f254e74063e4026ac33b786513 in 2013.
|
||||||
|
if(BUILD_SHARED_LIBS AND CMAKE_C_COMPILE_OPTIONS_VISIBILITY)
|
||||||
set_target_properties(liblzma PROPERTIES C_VISIBILITY_PRESET hidden)
|
set_target_properties(liblzma PROPERTIES C_VISIBILITY_PRESET hidden)
|
||||||
target_compile_definitions(liblzma PRIVATE HAVE_VISIBILITY=1)
|
target_compile_definitions(liblzma PRIVATE HAVE_VISIBILITY=1)
|
||||||
else()
|
else()
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
#
|
||||||
|
# tuklib_gnu_c_attributes.cmake - Checks for GNU C attributes
|
||||||
|
#
|
||||||
|
# Author: Lasse Collin
|
||||||
|
#
|
||||||
|
# This file has been put into the public domain.
|
||||||
|
# You can do whatever you want with this file.
|
||||||
|
#
|
||||||
|
|
||||||
|
include("${CMAKE_CURRENT_LIST_DIR}/tuklib_common.cmake")
|
||||||
|
include(CheckCSourceCompiles)
|
||||||
|
|
||||||
|
# This is a helper function for the actual attribute tests.
|
||||||
|
function(tuklib_check_attribute CODE RESULT)
|
||||||
|
# GCC, Clang, ICC, Solaris Studio, and XLC don't exit with
|
||||||
|
# a non-zero exit status if an unknown attribute is provided.
|
||||||
|
# They only print a warning. Accept the attribute only if no
|
||||||
|
# attribute-related warnings were issued.
|
||||||
|
#
|
||||||
|
# - XLC doesn't use the lower-case string "warning".
|
||||||
|
# It might use "WARNING" on z/OS or "(W)" on AIX.
|
||||||
|
# So "warning" isn't checked.
|
||||||
|
#
|
||||||
|
# - A few XLC messages use "Attribute" instead of "attribute".
|
||||||
|
#
|
||||||
|
# - ICC doesn't use the word "ignored".
|
||||||
|
#
|
||||||
|
# The problem with this method is that the regex might become
|
||||||
|
# outdated with newer compiler versions. Using -Werror would be
|
||||||
|
# an alternative but it fails if warnings occur for reasons other
|
||||||
|
# than unsupported attribute.
|
||||||
|
#
|
||||||
|
# The first pattern is for GCC, Solaris Studio, and XLC.
|
||||||
|
# The second one is for ICC. Both patterns work with Clang.
|
||||||
|
# Matching the leading space or colon reduces chances of
|
||||||
|
# matching any unrelated messages.
|
||||||
|
check_c_source_compiles("${CODE} int main(void) { return 0; }" "${RESULT}"
|
||||||
|
FAIL_REGEX " [Aa]ttribute .* ignored"
|
||||||
|
": unknown attribute")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(tuklib_check_func_attribute_always_inline RESULT)
|
||||||
|
tuklib_check_attribute("
|
||||||
|
__attribute__((__always_inline__))
|
||||||
|
static inline int my_inline_func(int x) { return x + 1; }
|
||||||
|
void my_func(void) { return my_inline_func(123); }
|
||||||
|
" "${RESULT}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(tuklib_check_func_attribute_constructor RESULT)
|
||||||
|
tuklib_check_attribute("
|
||||||
|
__attribute__((__constructor__))
|
||||||
|
void my_constructor_func(void) { return; }
|
||||||
|
" "${RESULT}")
|
||||||
|
endfunction()
|
||||||
|
|
||||||
|
function(tuklib_check_func_attribute_ifunc RESULT)
|
||||||
|
tuklib_check_attribute("
|
||||||
|
static void func(void) { return; }
|
||||||
|
static void (*resolve_func(void))(void) { return &func; }
|
||||||
|
void func_ifunc(void)
|
||||||
|
__attribute__((__ifunc__(\"resolve_func\")));
|
||||||
|
" "${RESULT}")
|
||||||
|
endfunction()
|
64
configure.ac
64
configure.ac
|
@ -820,32 +820,7 @@ AC_SYS_LARGEFILE
|
||||||
AC_C_BIGENDIAN
|
AC_C_BIGENDIAN
|
||||||
|
|
||||||
# __attribute__((__constructor__)) can be used for one-time initializations.
|
# __attribute__((__constructor__)) can be used for one-time initializations.
|
||||||
# Use -Werror because some compilers accept unknown attributes and just
|
AX_GCC_FUNC_ATTRIBUTE([constructor])
|
||||||
# give a warning.
|
|
||||||
#
|
|
||||||
# FIXME? Unfortunately -Werror can cause trouble if CFLAGS contains options
|
|
||||||
# that produce warnings for unrelated reasons. For example, GCC and Clang
|
|
||||||
# support -Wunused-macros which will warn about "#define _GNU_SOURCE 1"
|
|
||||||
# which will be among the #defines that Autoconf inserts to the beginning of
|
|
||||||
# the test program. There seems to be no nice way to prevent Autoconf from
|
|
||||||
# inserting the any defines to the test program.
|
|
||||||
AC_MSG_CHECKING([if __attribute__((__constructor__)) can be used])
|
|
||||||
have_func_attribute_constructor=no
|
|
||||||
OLD_CFLAGS="$CFLAGS"
|
|
||||||
CFLAGS="$CFLAGS -Werror"
|
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
__attribute__((__constructor__))
|
|
||||||
static void my_constructor_func(void) { return; }
|
|
||||||
]])], [
|
|
||||||
AC_DEFINE([HAVE_FUNC_ATTRIBUTE_CONSTRUCTOR], [1],
|
|
||||||
[Define to 1 if __attribute__((__constructor__))
|
|
||||||
is supported for functions.])
|
|
||||||
have_func_attribute_constructor=yes
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
])
|
|
||||||
CFLAGS="$OLD_CFLAGS"
|
|
||||||
|
|
||||||
# The Win95 threading lacks a thread-safe one-time initialization function.
|
# The Win95 threading lacks a thread-safe one-time initialization function.
|
||||||
# The one-time initialization is needed for crc32_small.c and crc64_small.c
|
# The one-time initialization is needed for crc32_small.c and crc64_small.c
|
||||||
|
@ -853,7 +828,7 @@ CFLAGS="$OLD_CFLAGS"
|
||||||
# win95, and the compiler does not support attribute constructor, then we
|
# win95, and the compiler does not support attribute constructor, then we
|
||||||
# would end up with a multithreaded build that is thread-unsafe. As a
|
# would end up with a multithreaded build that is thread-unsafe. As a
|
||||||
# result this configuration is not allowed.
|
# result this configuration is not allowed.
|
||||||
if test "x$enable_small$enable_threads$have_func_attribute_constructor"\
|
if test "x$enable_small$enable_threads$ax_cv_have_func_attribute_constructor" \
|
||||||
= xyeswin95no; then
|
= xyeswin95no; then
|
||||||
AC_MSG_ERROR([--enable-threads=win95 and --enable-small cannot be
|
AC_MSG_ERROR([--enable-threads=win95 and --enable-small cannot be
|
||||||
used at the same time with a compiler that doesn't support
|
used at the same time with a compiler that doesn't support
|
||||||
|
@ -867,35 +842,12 @@ fi
|
||||||
AC_ARG_ENABLE([ifunc], [AS_HELP_STRING([--disable-ifunc],
|
AC_ARG_ENABLE([ifunc], [AS_HELP_STRING([--disable-ifunc],
|
||||||
[do not use __attribute__((__ifunc__()))])],
|
[do not use __attribute__((__ifunc__()))])],
|
||||||
[], [enable_ifunc=yes])
|
[], [enable_ifunc=yes])
|
||||||
|
AS_IF([test "x$enable_ifunc" = xyes], [AX_GCC_FUNC_ATTRIBUTE([ifunc])])
|
||||||
|
|
||||||
if test "x$enable_ifunc" = xyes ; then
|
# GCC >= 3.2 and Clang support the attribute always_inline but a few other
|
||||||
OLD_CFLAGS="$CFLAGS"
|
# compilers support it too. So it's better to check for the support here
|
||||||
CFLAGS="$CFLAGS -Werror"
|
# instead of just checking if __GNUC__ or __clang__ is defined.
|
||||||
AC_MSG_CHECKING([if __attribute__((__ifunc__())) can be used])
|
AX_GCC_FUNC_ATTRIBUTE([always_inline])
|
||||||
AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
|
|
||||||
static void func(void) { return; }
|
|
||||||
static void (*resolve_func (void)) (void) { return func; }
|
|
||||||
void func_ifunc (void)
|
|
||||||
__attribute__((__ifunc__("resolve_func")));
|
|
||||||
/*
|
|
||||||
* 'clang -Wall' incorrectly warns that resolve_func is
|
|
||||||
* unused (-Wunused-function). Correct assembly output is
|
|
||||||
* still produced. This problem exists at least in Clang
|
|
||||||
* versions 4 to 17. The following silences the bogus warning:
|
|
||||||
*/
|
|
||||||
void make_clang_quiet(void);
|
|
||||||
void make_clang_quiet(void) { resolve_func()(); }
|
|
||||||
]])], [
|
|
||||||
AC_DEFINE([HAVE_FUNC_ATTRIBUTE_IFUNC], [1],
|
|
||||||
[Define to 1 if __attribute__((__ifunc__()))
|
|
||||||
is supported for functions.])
|
|
||||||
AC_MSG_RESULT([yes])
|
|
||||||
], [
|
|
||||||
AC_MSG_RESULT([no])
|
|
||||||
])
|
|
||||||
|
|
||||||
CFLAGS="$OLD_CFLAGS"
|
|
||||||
fi
|
|
||||||
|
|
||||||
|
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
@ -1223,7 +1175,7 @@ if test x$tuklib_cv_cpucores_method = xunknown; then
|
||||||
echo "No supported method to detect the number of CPU cores."
|
echo "No supported method to detect the number of CPU cores."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test "x$enable_threads$enable_small$have_func_attribute_constructor" \
|
if test "x$enable_threads$enable_small$ax_cv_have_func_attribute_constructor" \
|
||||||
= xnoyesno; then
|
= xnoyesno; then
|
||||||
echo
|
echo
|
||||||
echo "NOTE:"
|
echo "NOTE:"
|
||||||
|
|
|
@ -0,0 +1,279 @@
|
||||||
|
# ===========================================================================
|
||||||
|
# https://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html
|
||||||
|
#
|
||||||
|
# NOTE: This is a modified version! This has a fix for the grep pattern
|
||||||
|
# to make it detect unsupported attributes with GCC < 4.6, Clang >= 3.5,
|
||||||
|
# ICC, Solaris Studio, XL C, and CompCert.
|
||||||
|
# ===========================================================================
|
||||||
|
#
|
||||||
|
# SYNOPSIS
|
||||||
|
#
|
||||||
|
# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE)
|
||||||
|
#
|
||||||
|
# DESCRIPTION
|
||||||
|
#
|
||||||
|
# This macro checks if the compiler supports one of GCC's function
|
||||||
|
# attributes; many other compilers also provide function attributes with
|
||||||
|
# the same syntax. Compiler warnings are used to detect supported
|
||||||
|
# attributes as unsupported ones are ignored by default so quieting
|
||||||
|
# warnings when using this macro will yield false positives.
|
||||||
|
#
|
||||||
|
# The ATTRIBUTE parameter holds the name of the attribute to be checked.
|
||||||
|
#
|
||||||
|
# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_<ATTRIBUTE>.
|
||||||
|
#
|
||||||
|
# The macro caches its result in the ax_cv_have_func_attribute_<attribute>
|
||||||
|
# variable.
|
||||||
|
#
|
||||||
|
# The macro currently supports the following function attributes:
|
||||||
|
#
|
||||||
|
# alias
|
||||||
|
# aligned
|
||||||
|
# alloc_size
|
||||||
|
# always_inline
|
||||||
|
# artificial
|
||||||
|
# cold
|
||||||
|
# const
|
||||||
|
# constructor
|
||||||
|
# constructor_priority for constructor attribute with priority
|
||||||
|
# deprecated
|
||||||
|
# destructor
|
||||||
|
# dllexport
|
||||||
|
# dllimport
|
||||||
|
# error
|
||||||
|
# externally_visible
|
||||||
|
# fallthrough
|
||||||
|
# flatten
|
||||||
|
# format
|
||||||
|
# format_arg
|
||||||
|
# gnu_format
|
||||||
|
# gnu_inline
|
||||||
|
# hot
|
||||||
|
# ifunc
|
||||||
|
# leaf
|
||||||
|
# malloc
|
||||||
|
# noclone
|
||||||
|
# noinline
|
||||||
|
# nonnull
|
||||||
|
# noreturn
|
||||||
|
# nothrow
|
||||||
|
# optimize
|
||||||
|
# pure
|
||||||
|
# sentinel
|
||||||
|
# sentinel_position
|
||||||
|
# unused
|
||||||
|
# used
|
||||||
|
# visibility
|
||||||
|
# warning
|
||||||
|
# warn_unused_result
|
||||||
|
# weak
|
||||||
|
# weakref
|
||||||
|
#
|
||||||
|
# Unsupported function attributes will be tested with a prototype
|
||||||
|
# returning an int and not accepting any arguments and the result of the
|
||||||
|
# check might be wrong or meaningless so use with care.
|
||||||
|
#
|
||||||
|
# The following are known to only warn about unsupported attributes:
|
||||||
|
# GCC, Clang/LLVM and Clang-based compilers, Intel C Compiler Classic (ICC),
|
||||||
|
# Oracle Solaris Studio, IBM XL C, and CompCert. Examples:
|
||||||
|
#
|
||||||
|
# GCC <= 4.5.3:
|
||||||
|
# warning: 'foobar' attribute directive ignored
|
||||||
|
#
|
||||||
|
# GCC >= 4.6:
|
||||||
|
# warning: 'foobar' attribute directive ignored [-Wattributes]
|
||||||
|
#
|
||||||
|
# Clang < 3.5:
|
||||||
|
# warning: unknown attribute 'foobar' ignored [-Wattributes]
|
||||||
|
#
|
||||||
|
# Clang >= 3.5, CompCert:
|
||||||
|
# warning: unknown attribute 'foobar' ignored [-Wunknown-attributes]
|
||||||
|
#
|
||||||
|
# ICC:
|
||||||
|
# warning #1292: unknown attribute "foobar"
|
||||||
|
#
|
||||||
|
# Solaris Studio:
|
||||||
|
# warning: attribute "foobar" is unknown, ignored
|
||||||
|
#
|
||||||
|
# XL C message might not contain "warning" but might contain
|
||||||
|
# "WARNING" (z/OS) or "(W)" (AIX). Documentation lists many
|
||||||
|
# attribute-related messages but they all contain the strings
|
||||||
|
# "Attribute" or "attribute" and "ignored". For example:
|
||||||
|
# Attribute "foobar" is not supported and is ignored.
|
||||||
|
#
|
||||||
|
# The regex ' [Aa]ttribute .* ignored' matches all the above except
|
||||||
|
# ICC. It can be matched with ': unknown attribute' which happens to
|
||||||
|
# match Clang too.
|
||||||
|
#
|
||||||
|
# LICENSE
|
||||||
|
#
|
||||||
|
# Copyright (c) 2013 Gabriele Svelto <gabriele.svelto@gmail.com>
|
||||||
|
#
|
||||||
|
# Copying and distribution of this file, with or without modification, are
|
||||||
|
# permitted in any medium without royalty provided the copyright notice
|
||||||
|
# and this notice are preserved. This file is offered as-is, without any
|
||||||
|
# warranty.
|
||||||
|
|
||||||
|
#serial 13
|
||||||
|
|
||||||
|
AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [
|
||||||
|
AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1])
|
||||||
|
|
||||||
|
AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [
|
||||||
|
AC_LINK_IFELSE([AC_LANG_PROGRAM([
|
||||||
|
m4_case([$1],
|
||||||
|
[alias], [
|
||||||
|
int foo( void ) { return 0; }
|
||||||
|
int bar( void ) __attribute__(($1("foo")));
|
||||||
|
],
|
||||||
|
[aligned], [
|
||||||
|
int foo( void ) __attribute__(($1(32)));
|
||||||
|
],
|
||||||
|
[alloc_size], [
|
||||||
|
void *foo(int a) __attribute__(($1(1)));
|
||||||
|
],
|
||||||
|
[always_inline], [
|
||||||
|
inline __attribute__(($1)) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[artificial], [
|
||||||
|
inline __attribute__(($1)) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[cold], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[const], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[constructor_priority], [
|
||||||
|
int foo( void ) __attribute__((__constructor__(65535/2)));
|
||||||
|
],
|
||||||
|
[constructor], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[deprecated], [
|
||||||
|
int foo( void ) __attribute__(($1("")));
|
||||||
|
],
|
||||||
|
[destructor], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[dllexport], [
|
||||||
|
__attribute__(($1)) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[dllimport], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[error], [
|
||||||
|
int foo( void ) __attribute__(($1("")));
|
||||||
|
],
|
||||||
|
[externally_visible], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[fallthrough], [
|
||||||
|
void foo( int x ) {switch (x) { case 1: __attribute__(($1)); case 2: break ; }};
|
||||||
|
],
|
||||||
|
[flatten], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[format], [
|
||||||
|
int foo(const char *p, ...) __attribute__(($1(printf, 1, 2)));
|
||||||
|
],
|
||||||
|
[gnu_format], [
|
||||||
|
int foo(const char *p, ...) __attribute__((format(gnu_printf, 1, 2)));
|
||||||
|
],
|
||||||
|
[format_arg], [
|
||||||
|
char *foo(const char *p) __attribute__(($1(1)));
|
||||||
|
],
|
||||||
|
[gnu_inline], [
|
||||||
|
inline __attribute__(($1)) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[hot], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[ifunc], [
|
||||||
|
int my_foo( void ) { return 0; }
|
||||||
|
static int (*resolve_foo(void))(void) { return my_foo; }
|
||||||
|
int foo( void ) __attribute__(($1("resolve_foo")));
|
||||||
|
],
|
||||||
|
[leaf], [
|
||||||
|
__attribute__(($1)) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[malloc], [
|
||||||
|
void *foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[noclone], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[noinline], [
|
||||||
|
__attribute__(($1)) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[nonnull], [
|
||||||
|
int foo(char *p) __attribute__(($1(1)));
|
||||||
|
],
|
||||||
|
[noreturn], [
|
||||||
|
void foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[nothrow], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[optimize], [
|
||||||
|
__attribute__(($1(3))) int foo( void ) { return 0; }
|
||||||
|
],
|
||||||
|
[pure], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[sentinel], [
|
||||||
|
int foo(void *p, ...) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[sentinel_position], [
|
||||||
|
int foo(void *p, ...) __attribute__(($1(1)));
|
||||||
|
],
|
||||||
|
[returns_nonnull], [
|
||||||
|
void *foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[unused], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[used], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[visibility], [
|
||||||
|
int foo_def( void ) __attribute__(($1("default")));
|
||||||
|
int foo_hid( void ) __attribute__(($1("hidden")));
|
||||||
|
int foo_int( void ) __attribute__(($1("internal")));
|
||||||
|
int foo_pro( void ) __attribute__(($1("protected")));
|
||||||
|
],
|
||||||
|
[warning], [
|
||||||
|
int foo( void ) __attribute__(($1("")));
|
||||||
|
],
|
||||||
|
[warn_unused_result], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[weak], [
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
],
|
||||||
|
[weakref], [
|
||||||
|
static int foo( void ) { return 0; }
|
||||||
|
static int bar( void ) __attribute__(($1("foo")));
|
||||||
|
],
|
||||||
|
[
|
||||||
|
m4_warn([syntax], [Unsupported attribute $1, the test may fail])
|
||||||
|
int foo( void ) __attribute__(($1));
|
||||||
|
]
|
||||||
|
)], [])
|
||||||
|
],
|
||||||
|
dnl Some compilers don't exit with an error if an unknown
|
||||||
|
dnl attribute is provided. They only output a warning, so accept
|
||||||
|
dnl the attribute only if no attribute-related warnings were issued.
|
||||||
|
[AS_IF([[grep ' [Aa]ttribute .* ignored' conftest.err >/dev/null \
|
||||||
|
|| grep ': unknown attribute' conftest.err >/dev/null]],
|
||||||
|
[AS_VAR_SET([ac_var], [no])],
|
||||||
|
[AS_VAR_SET([ac_var], [yes])])],
|
||||||
|
[AS_VAR_SET([ac_var], [no])])
|
||||||
|
])
|
||||||
|
|
||||||
|
AS_IF([test yes = AS_VAR_GET([ac_var])],
|
||||||
|
[AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1,
|
||||||
|
[Define to 1 if the system has the `$1' function attribute])], [])
|
||||||
|
|
||||||
|
AS_VAR_POPDEF([ac_var])
|
||||||
|
])
|
|
@ -190,6 +190,16 @@ typedef unsigned char _Bool;
|
||||||
# define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
|
# define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// With MSVC, __forceinline can be used instead of inline.
|
||||||
|
// Using both keywords results in a warning.
|
||||||
|
#if defined(HAVE_FUNC_ATTRIBUTE_ALWAYS_INLINE)
|
||||||
|
# define lzma_always_inline inline __attribute__((__always_inline__))
|
||||||
|
#elif defined(_MSC_VER)
|
||||||
|
# define lzma_always_inline __forceinline
|
||||||
|
#else
|
||||||
|
# define lzma_always_inline inline
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(__GNUC__) \
|
#if defined(__GNUC__) \
|
||||||
&& ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4)
|
&& ((__GNUC__ == 4 && __GNUC_MINOR__ >= 3) || __GNUC__ > 4)
|
||||||
# define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x)))
|
# define lzma_attr_alloc_size(x) __attribute__((__alloc_size__(x)))
|
||||||
|
|
|
@ -49,8 +49,7 @@
|
||||||
/// It's rounded up to 2^n. This extra amount needs to be
|
/// It's rounded up to 2^n. This extra amount needs to be
|
||||||
/// allocated in the buffers being used. It needs to be
|
/// allocated in the buffers being used. It needs to be
|
||||||
/// initialized too to keep Valgrind quiet.
|
/// initialized too to keep Valgrind quiet.
|
||||||
lzma_attribute((__always_inline__))
|
static lzma_always_inline uint32_t
|
||||||
static inline uint32_t
|
|
||||||
lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2,
|
lzma_memcmplen(const uint8_t *buf1, const uint8_t *buf2,
|
||||||
uint32_t len, uint32_t limit)
|
uint32_t len, uint32_t limit)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue