Files
rocm-systems/projects/rocprofiler-systems/source/lib/omnitrace-rt/h/compiler_annotations.h
T
Jonathan R. Madsen 8ad58c5d28 Build omnitrace-rt library (#355)
* Build omnitrace-rt library

- Explicitly build dyninstAPI_RT as omnitrace-rt so that the SONAME in the ELF is omnitrace-rt instead of dyninstAPI_RT
- Create symbolic link lib/omnitrace/libdyninstAPI_RT.so which points to lib/libomnitrace-rt.so
- Simplify build tree location of libomnitrace-rt.so since it is ../lib from the bin directory even in the build tree
- Update dyninst submodule with minor tweaks to dyninstAPI_RT/CMakeLists.txt

* Update source/lib/omnitrace-rt/cmake/platform.cmake

* Use ftpmirror.gnu.org instead of ftp.gnu.org

- in timemory and dyninst submodules
- minor .clang-tidy tweak

[ROCm/rocprofiler-systems commit: 0cf017251e]
2024-06-27 16:51:43 -05:00

172 baris
6.8 KiB
C++

/*
* See the dyninst/COPYRIGHT file for copyright information.
*
* We provide the Paradyn Tools (below described as "Paradyn")
* on an AS IS basis, and do not warrant its validity or performance.
* We reserve the right to update, modify, or discontinue this
* software at any time. We shall have no obligation to supply such
* updates or modifications or any other form of support to you.
*
* By your use of Paradyn, you understand and agree that we (or any
* other person or entity with proprietary rights in Paradyn) are
* under no obligation to provide either maintenance services,
* update services, notices of latent defects, or correction of
* defects for Paradyn.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef COMPILER_ANNOTATIONS_H
#define COMPILER_ANNOTATIONS_H
/***********************************************************************
*
* DYNINST_FALLTHROUGH
*
* Eliminates "this statement may fall through" warnings when used as the last
* statment of a switch case that falls through to the next case. The macro
* is used as shown in indicate that case 2 should fall through to case 1.
*
* switch (x) {
* case 2:
* foo();
* DYNINST_FALLTHROUGH;
* case 1:
* foo();
* break;
* default:
* error();
* break;
* }
*/
#if defined(__cpluscplus) && defined(__has_cpp_attribute)
# if __has_cpp_attribute(fallthrough)
# define DYNINST_FALLTHROUGH [[fallthrough]]
# elif __has_cpp_attribute(gcc::fallthrough)
# define DYNINST_FALLTHROUGH [[gcc::fallthrough]]
# elif __has_cpp_attribute(clang::fallthrough)
# define DYNINST_FALLTHROUGH [[clang::fallthrough]]
# endif
#elif !defined(__cpluscplus) && defined(__has_c_attribute)
# if __has_c_attribute(fallthrough)
# define DYNINST_FALLTHROUGH [[fallthrough]]
# elif __STDC_VERSION__ > 201710
// scoped attribute names are only valid in C starting with 2x
# if __has_c_attribute(gcc::fallthrough)
# define DYNINST_FALLTHROUGH [[gcc::fallthrough]]
# elif __has_c_attribute(clang::fallthrough)
# define DYNINST_FALLTHROUGH [[clang::fallthrough]]
# endif
# endif
#elif defined(__has_attribute)
# if __has_attribute(fallthrough)
# define DYNINST_FALLTHROUGH __attribute__((fallthrough))
# elif __cplusplus || __STDC_VERSION__ > 201710
// scoped attribute names are only valid in C++ or C starting with 2x
# if __has_attribute(gcc::fallthrough)
# define DYNINST_FALLTHROUGH __attribute__((gcc::fallthrough))
# elif __has_attribute(clang::fallthrough)
# define DYNINST_FALLTHROUGH __attribute__((clang::fallthrough))
# endif
# endif
#endif
#if !defined(DYNINST_FALLTHROUGH)
# define DYNINST_FALLTHROUGH \
do \
{ \
} while(0)
#endif
/***********************************************************************
*
* DYNINST_PRINTF_ANNOTATION(fmtIndex, argIndex)
* DYNINST_SCANF_ANNOTATION(fmtIndex, argIndex)
* DYNINST_FORMAT_ANNOTATION(fmtType, fmtIndex, argIndex)
*
* Annotates a function as taking a printf for scanf format string and vararg
* list of values allowing the compiler to validate the format string and the
* supplied arguments. fmtIndex is the 1-based index of the format string, and
* argIndex is the 1-based index that begins the variable argument list used by
* printf or scanf.
*
* The annotation should be placed after the declaration of the function. For
* example:
*
* myprintf(int level, char *fmt, ...) DYNINST_PRINTF_ANNOTATION(2, 3);
*/
#if defined(__has_attribute)
# if __has_attribute(format)
# define DYNINST_FORMAT_ANNOTATION(fmtType, fmtIndex, argIndex) \
__attribute__((format(fmtType, fmtIndex, argIndex)))
# endif
#endif
#if !defined(DYNINST_FORMAT_ANNOTATION)
# define DYNINST_FORMAT_ANNOTATION(fmtType, fmtIndex, argIndex)
#endif
#define DYNINST_PRINTF_ANNOTATION(fmtIndex, argIndex) \
DYNINST_FORMAT_ANNOTATION(printf, fmtIndex, argIndex)
#define DYNINST_SCANF_ANNOTATION(fmtIndex, argIndex) \
DYNINST_FORMAT_ANNOTATION(scanf, fmtIndex, argIndex)
/***********************************************************************
*
* DYNINST_MALLOC_ANNOTATION
* DYNINST_MALLOC_DEALLOC_ANNOTATION(freeFunction)
* DYNINST_MALLOC_DEALLOC_POS_ANNOTATION(freeFunction, pos)
*
* Annotates a function as returning a unique pointer to suitable memory
* to hold an object. The second form names the matching deallocator, and
* the third form indicates the position of the pointer in the argument list.
*
* The annotation should be placed after the declaration of the function. For
* example:
*
* Obj* myalloc(int x) DYNINST_MALLOC_ANNOTATION;
* void mydealloc2(Obj* o);
* Obj* myalloc2(int x) DYNINST_MALLOC_DEALLOC_ANNOTATION(mydealloc2);
* void mydealloc3(int y, Obj* o);
* Obj* myalloc3(int x) DYNINST_MALLOC_DEALLOC_POS_ANNOTATION(mydealloc3, 2);
*/
#if defined(__has_attribute)
# if __has_attribute(malloc)
# define DYNINST_MALLOC_ANNOTATION __attribute__((malloc))
# if __GNUC__ >= 11
// malloc attribute with 1 and 2 params is gcc 11 and later only
# define DYNINST_MALLOC_DEALLOC_ANNOTATION(f) \
__attribute__((malloc, malloc(f)))
# define DYNINST_MALLOC_DEALLOC_POS_ANNOTATION(f, p) \
__attribute__((malloc, malloc(f, p)))
# endif
# endif
#endif
#if !defined(DYNINST_MALLOC_ANNOTATION)
# define DYNINST_MALLOC_ANNOTATION
#endif
#if !defined(DYNINST_MALLOC_DEALLOC_ANNOTATION)
# define DYNINST_MALLOC_DEALLOC_ANNOTATION(f) DYNINST_MALLOC_ANNOTATION
#endif
#if !defined(DYNINST_MALLOC_DEALLOC_POS_ANNOTATION)
# define DYNINST_MALLOC_DEALLOC_POS_ANNOTATION(f, p) DYNINST_MALLOC_ANNOTATION
#endif
#endif /* COMPILER_ANNOTATIONS_H */