1
0
mirror of https://gitlab.com/libvirt/libvirt.git synced 2025-12-03 16:25:09 +03:00
Files
libvirt/scripts/cocci-macro-file.h
Michal Privoznik 76f8c0b80d internal: Introduce ATTRIBUTE_MOCKABLE
Currently, if we want to mock a function the noinline attribute
is appended after the function (via G_NO_INLINE macro). This used
to work for non pure functions. But there are some trivial
functions (for instance virQEMUCapsProbeHVF()) that are pure,
i.e. have no side effect, and while their call from other parts
of the code is not optimized out, their call from within the same
compilation unit (qemu_capabilities.c) is optimized out.

This is because inlining and semantic interposition are two
different things. Even GCC's documentation for noinline attribute
[1] states that clearly:

  This function attribute prevents a function from being
  considered for inlining. It also disables some other
  interprocedural optimizations; it’s preferable to use the more
  comprehensive noipa attribute instead if that is your goal.

  Even if a function is declared with the noinline attribute,
  there are optimizations other than inlining that can cause
  calls to be optimized away if it does not have side effects,
  although the function call is live.

Unfortunately, despite attempts [2] Clang still does not support
the attribute and thus we have to rely on noinline +
-fsemantic-interposition combo.

1: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-noinline-function-attribute
2: https://reviews.llvm.org/D101011

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
2025-05-02 14:31:19 +02:00

41 lines
1.2 KiB
C

/*
* cocci-macro-file.h: simplified macro definitions for Coccinelle
*
* 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, see
* <http://www.gnu.org/licenses/>.
*
* To be used with:
* $ spatch --macro-file scripts/cocci-macro-file.h
*/
#pragma once
#define ATTRIBUTE_MOCKABLE
#define ATTRIBUTE_NONNULL(x)
#define ATTRIBUTE_PACKED
#define G_GNUC_WARN_UNUSED_RESULT
#define G_GNUC_UNUSED
#define G_GNUC_NULL_TERMINATED
#define G_GNUC_NORETURN
#define G_NO_INLINE
#define G_GNUC_FALLTHROUGH
#define G_GNUC_PRINTF(a, b)
#define g_autoptr(x) x##_autoptr
#define g_autofree
#define g_auto(x) x
#define BAD_CAST