Skip to content
Snippets Groups Projects
  • Richard Henderson's avatar
    44b99a6d
    exec: Build page-vary-common.c with -fno-lto · 44b99a6d
    Richard Henderson authored
    
    In bbc17caf, we used an alias attribute to allow target_page
    to be declared const, and yet be initialized late.
    
    This fails when using LTO with several versions of gcc.
    The compiler looks through the alias and decides that the const
    variable is statically initialized to zero, then propagates that
    zero to many uses of the variable.
    
    This can be avoided by compiling one object file with -fno-lto.
    In this way, any initializer cannot be seen, and the constant
    propagation does not occur.
    
    Since we are certain to have this separate compilation unit, we
    can drop the alias attribute as well.  We simply have differing
    declarations for target_page in different compilation units.
    Drop the use of init_target_page, and drop the configure detection
    for CONFIG_ATTRIBUTE_ALIAS.
    
    In order to change the compilation flags for a file with meson,
    we must use a static_library.  This runs into specific_ss, where
    we would need to create many static_library instances.
    
    Fix this by splitting page-vary.c: the page-vary-common.c part is
    compiled once as a static_library, while the page-vary.c part is
    left in specific_ss in order to handle the target-specific value
    of TARGET_PAGE_BITS_MIN.
    
    Reported-by: default avatarGavin Shan <gshan@redhat.com>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-Id: <20210321211534.2101231-1-richard.henderson@linaro.org>
    [PMD: Fix typo in subject, split original patch in 3]
    Signed-off-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
    Tested-by: default avatarGavin Shan <gshan@redhat.com>
    Message-Id: <20210322112427.4045204-4-f4bug@amsat.org>
    [rth: Update MAINTAINERS]
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    44b99a6d
    History
    exec: Build page-vary-common.c with -fno-lto
    Richard Henderson authored
    
    In bbc17caf, we used an alias attribute to allow target_page
    to be declared const, and yet be initialized late.
    
    This fails when using LTO with several versions of gcc.
    The compiler looks through the alias and decides that the const
    variable is statically initialized to zero, then propagates that
    zero to many uses of the variable.
    
    This can be avoided by compiling one object file with -fno-lto.
    In this way, any initializer cannot be seen, and the constant
    propagation does not occur.
    
    Since we are certain to have this separate compilation unit, we
    can drop the alias attribute as well.  We simply have differing
    declarations for target_page in different compilation units.
    Drop the use of init_target_page, and drop the configure detection
    for CONFIG_ATTRIBUTE_ALIAS.
    
    In order to change the compilation flags for a file with meson,
    we must use a static_library.  This runs into specific_ss, where
    we would need to create many static_library instances.
    
    Fix this by splitting page-vary.c: the page-vary-common.c part is
    compiled once as a static_library, while the page-vary.c part is
    left in specific_ss in order to handle the target-specific value
    of TARGET_PAGE_BITS_MIN.
    
    Reported-by: default avatarGavin Shan <gshan@redhat.com>
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
    Message-Id: <20210321211534.2101231-1-richard.henderson@linaro.org>
    [PMD: Fix typo in subject, split original patch in 3]
    Signed-off-by: default avatarPhilippe Mathieu-Daudé <f4bug@amsat.org>
    Tested-by: default avatarGavin Shan <gshan@redhat.com>
    Message-Id: <20210322112427.4045204-4-f4bug@amsat.org>
    [rth: Update MAINTAINERS]
    Signed-off-by: default avatarRichard Henderson <richard.henderson@linaro.org>
page-vary.c 1.19 KiB
/*
 * Variable page size handling -- target specific part.
 *
 *  Copyright (c) 2003 Fabrice Bellard
 *
 * 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/>.
 */

#define IN_PAGE_VARY 1

#include "qemu/osdep.h"
#include "qemu-common.h"
#include "exec/exec-all.h"

bool set_preferred_target_page_bits(int bits)
{
#ifdef TARGET_PAGE_BITS_VARY
    assert(bits >= TARGET_PAGE_BITS_MIN);
    return set_preferred_target_page_bits_common(bits);
#else
    return true;
#endif
}

void finalize_target_page_bits(void)
{
#ifdef TARGET_PAGE_BITS_VARY
    finalize_target_page_bits_common(TARGET_PAGE_BITS_MIN);
#endif
}