The Meson Build System
http://mesonbuild.com/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.6 KiB
120 lines
3.6 KiB
# Copyright © 2017-2018 Intel Corporation |
|
# |
|
# Licensed under the Apache License, Version 2.0 (the "License"); |
|
# you may not use this file except in compliance with the License. |
|
# You may obtain a copy of the License at |
|
# |
|
# http://www.apache.org/licenses/LICENSE-2.0 |
|
# |
|
# Unless required by applicable law or agreed to in writing, software |
|
# distributed under the License is distributed on an "AS IS" BASIS, |
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
|
# See the License for the specific language governing permissions and |
|
# limitations under the License. |
|
|
|
project('gcc func attributes', ['c', 'cpp']) |
|
|
|
# For msvc these will fail because msvc doesn't support __attribute__, for |
|
# Clang and GCC, they should pass. |
|
c = meson.get_compiler('c') |
|
cpp = meson.get_compiler('cpp') |
|
|
|
if c.get_id() == 'pgi' |
|
error('MESON_SKIP_TEST: PGI supports its own set of features, will need a separate list for PGI to test it.') |
|
endif |
|
|
|
expected_result = not ['msvc', 'clang-cl', 'intel-cl'].contains(c.get_id()) |
|
|
|
# Q: Why is ifunc not in this list or any of the below lists? |
|
# A: It's too damn hard to figure out if you actually support it, since it |
|
# requires both compiler and libc support, and there isn't a good way to |
|
# figure that out except by running the code we're trying to test. |
|
attributes = [ |
|
'aligned', |
|
'always_inline', |
|
'cold', |
|
'const', |
|
'constructor', |
|
'constructor_priority', |
|
'deprecated', |
|
'destructor', |
|
'flatten', |
|
'format', |
|
'format_arg', |
|
'gnu_inline', |
|
'hot', |
|
'malloc', |
|
'noinline', |
|
'nonnull', |
|
'noreturn', |
|
'nothrow', |
|
'pure', |
|
'section', |
|
'sentinel', |
|
'unused', |
|
'used', |
|
'vector_size', |
|
'warn_unused_result', |
|
'weak', |
|
] |
|
|
|
if c.get_id() != 'intel' |
|
# not supported by icc as of 19.0.0 |
|
attributes += 'weakref' |
|
endif |
|
|
|
# These are unsupported on darwin with apple clang 9.1.0 |
|
if host_machine.system() != 'darwin' |
|
attributes += 'alias' |
|
attributes += 'visibility' |
|
attributes += 'alloc_size' |
|
endif |
|
|
|
if ['gcc', 'intel'].contains(c.get_id()) |
|
# not supported by clang as of 5.0.0 (at least up to 6.0.1) |
|
attributes += 'artificial' |
|
attributes += 'error' |
|
attributes += 'externally_visible' |
|
attributes += 'leaf' |
|
attributes += 'noclone' |
|
attributes += 'optimize' |
|
attributes += 'warning' |
|
|
|
if c.get_id() == 'gcc' and c.version().version_compare('>= 7.0.0') |
|
attributes += 'fallthrough' |
|
endif |
|
|
|
# XXX(arsen): limited to clang 13+ even though gcc 11 has it, since gcc |
|
# detects support for it at compile time based on binutils version |
|
if c.get_id() == 'clang' and c.version().version_compare('>= 13.0.0') |
|
attributes += 'retain' |
|
endif |
|
endif |
|
|
|
if get_option('mode') == 'single' |
|
foreach a : attributes |
|
x = c.has_function_attribute(a) |
|
assert(x == expected_result, '@0@: @1@'.format(c.get_id(), a)) |
|
x = cpp.has_function_attribute(a) |
|
assert(x == expected_result, '@0@: @1@'.format(cpp.get_id(), a)) |
|
endforeach |
|
|
|
win_expect = ['windows', 'cygwin'].contains(host_machine.system()) |
|
foreach a : ['dllexport', 'dllimport'] |
|
assert(c.has_function_attribute(a) == win_expect, |
|
'@0@: @1@'.format(c.get_id(), a)) |
|
assert(cpp.has_function_attribute(a) == win_expect, |
|
'@0@: @1@'.format(cpp.get_id(), a)) |
|
endforeach |
|
else |
|
if not ['msvc', 'clang-cl', 'intel-cl'].contains(c.get_id()) |
|
multi_expected = attributes |
|
else |
|
multi_expected = [] |
|
endif |
|
|
|
multi_check = c.get_supported_function_attributes(attributes) |
|
assert(multi_check == multi_expected, 'get_supported_function_arguments works (C)') |
|
multi_check = cpp.get_supported_function_attributes(attributes) |
|
assert(multi_check == multi_expected, 'get_supported_function_arguments works (C++)') |
|
endif
|
|
|