From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTPS id 8A43F4E4A9 for ; Tue, 11 Mar 2025 19:17:51 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 14CE568E1BC; Tue, 11 Mar 2025 21:17:48 +0200 (EET) Received: from mail-qt1-f202.google.com (mail-qt1-f202.google.com [209.85.160.202]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id C0E2F68E14C for ; Tue, 11 Mar 2025 21:17:41 +0200 (EET) Received: by mail-qt1-f202.google.com with SMTP id d75a77b69052e-47686947566so45842151cf.3 for ; Tue, 11 Mar 2025 12:17:41 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1741720660; x=1742325460; h=cc:to:from:subject:message-id:references:mime-version:in-reply-to :date:x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=sryR7SbhO4TD4RE/B4GDLyd5VlE9Q1DfCz0QBtxjHIs=; b=QLsmsgQFgUkFchc1BHDNHcUSRrIUr/+py/xkLek2O9ORokoNzot2qW1wO7i/4goJ22 HtL8e9t935fsJ/faHoKZm+dL7SL9gm0rCYzCMyD5v7yvRnVtG/SUpshnstV/GqgSdbcu eBPYK3l0hMiHRpgs44nScYxLWGwgtu2r+4f5MeSq9bYKKOoy3S+hfgjv9yVzjnR7yM1D PyF2g4b9D8iiht6lN3gZ3YjchNJ8Mzlwx7Kqj5uJ3IQhVxxQgI2Z2CNkJdDumgWV47S5 aHKCGxjAic/xxON7cK3neWrXeIix9VtMYjlh21SvPZPc734F8sh6Nl74rC/5LmNxoiW8 Okzw== X-Gm-Message-State: AOJu0YyY9hFyfegyjuQ4tWKlBw0EG/BT8mtNy54o012wp3120grnL4TF vEixgRnbioQFOaiAxQNcetP5b3bwXeHuigpCt68wyIINn4qxjLq2Op/Ta/BuEqEQ4lxHbWOB2j0 BwOqRCpcqvlmemPEiiadPgtDvTsf7IDI29Z1mqzxpdCQ72+4RfLWC60zydu9qJtqImtFumbK3WB bWqKOKHbqx4lmMPbw9GiJQwss= X-Google-Smtp-Source: AGHT+IEi/jXzud9Vib7eXSBTq5SZROExxKQmyIXJkztK49FbBATdjkFie/r2wJ1neCj5EwCxvHt+ZOOe X-Received: from qtg13.prod.google.com ([2002:a05:622a:d0d:b0:476:5f7b:bc9e]) (user=prka job=prod-delivery.src-stubby-dispatcher) by 2002:a05:622a:148c:b0:474:fab0:6564 with SMTP id d75a77b69052e-47699611c4fmr58197881cf.37.1741720660277; Tue, 11 Mar 2025 12:17:40 -0700 (PDT) Date: Tue, 11 Mar 2025 19:17:37 +0000 In-Reply-To: <20250303205612.3955254-1-prka@google.com> Mime-Version: 1.0 References: <20250303205612.3955254-1-prka@google.com> X-Mailer: git-send-email 2.49.0.rc0.332.g42c0ae87b1-goog Message-ID: <20250311191737.2393125-1-prka@google.com> To: ffmpeg-devel@ffmpeg.org Subject: [FFmpeg-devel] [PATCH v4] Mark C globals with small code model X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Pranav Kant via ffmpeg-devel Reply-To: FFmpeg development discussions and patches Cc: Pranav Kant Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: By default, all globals in C/C++ compiled by clang are allocated in non-large data sections. See [1] for background on code models. For PIC (Position independent code), this is fine as long as binary is small but as binary size increases, users maybe want to use medium/large code models (-mcmodel=medium) which moves data in to large sections. As data in these large sections cannot be accessed using PIC code anymore (as it may be too far away), compiler ends up using a different instruction sequence when building C/C++ code -- using GOT to access these globals (which can be relaxed by linker at link time if binary ends up being smaller). However, assembly files continue to access these globals defined in C/C++ files using older (and invalid instruction sequence). So, we mark all such globals with an attribute that forces them to be allocated in small sections allowing them to validly be accessed from the assembly code. This patch should not have any affect on builds that use small code model, which is the default mode. [1] https://eli.thegreenplace.net/2012/01/03/understanding-the-x64-code-models Signed-off-by: Pranav Kant --- libavcodec/ac3dsp.c | 2 ++ libavcodec/cabac.c | 2 ++ libavcodec/x86/constants.c | 8 ++++++++ libavutil/attributes.h | 6 ++++++ libavutil/attributes_internal.h | 16 ++++++++++++++++ 5 files changed, 34 insertions(+) diff --git a/libavcodec/ac3dsp.c b/libavcodec/ac3dsp.c index 730fa70fff..d16b6c24c3 100644 --- a/libavcodec/ac3dsp.c +++ b/libavcodec/ac3dsp.c @@ -25,6 +25,7 @@ #include "config.h" #include "libavutil/attributes.h" +#include "libavutil/attributes_internal.h" #include "libavutil/common.h" #include "libavutil/intmath.h" #include "libavutil/mem_internal.h" @@ -104,6 +105,7 @@ static void ac3_update_bap_counts_c(uint16_t mant_cnt[16], uint8_t *bap, mant_cnt[bap[len]]++; } +attribute_mcmodel_small DECLARE_ALIGNED(16, const uint16_t, ff_ac3_bap_bits)[16] = { 0, 0, 0, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 16 }; diff --git a/libavcodec/cabac.c b/libavcodec/cabac.c index 7d41cd2ae6..b8c6db29a2 100644 --- a/libavcodec/cabac.c +++ b/libavcodec/cabac.c @@ -24,11 +24,13 @@ * Context Adaptive Binary Arithmetic Coder. */ +#include "libavutil/attributes_internal.h" #include "libavutil/error.h" #include "libavutil/mem_internal.h" #include "cabac.h" +attribute_mcmodel_small DECLARE_ASM_ALIGNED(1, const uint8_t, ff_h264_cabac_tables)[512 + 4*2*64 + 4*64 + 63] = { 9,8,7,7,6,6,6,6,5,5,5,5,5,5,5,5, 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4, diff --git a/libavcodec/x86/constants.c b/libavcodec/x86/constants.c index bc7f2b17b8..347b7dd1d3 100644 --- a/libavcodec/x86/constants.c +++ b/libavcodec/x86/constants.c @@ -18,17 +18,21 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/attributes_internal.h" #include "libavutil/mem_internal.h" #include "libavutil/x86/asm.h" // for xmm_reg #include "constants.h" +attribute_mcmodel_small DECLARE_ALIGNED(32, const ymm_reg, ff_pw_1) = { 0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL, 0x0001000100010001ULL }; DECLARE_ALIGNED(32, const ymm_reg, ff_pw_2) = { 0x0002000200020002ULL, 0x0002000200020002ULL, 0x0002000200020002ULL, 0x0002000200020002ULL }; DECLARE_ASM_ALIGNED(16, const xmm_reg, ff_pw_3) = { 0x0003000300030003ULL, 0x0003000300030003ULL }; +attribute_mcmodel_small DECLARE_ASM_ALIGNED(32, const ymm_reg, ff_pw_4) = { 0x0004000400040004ULL, 0x0004000400040004ULL, 0x0004000400040004ULL, 0x0004000400040004ULL }; +attribute_mcmodel_small DECLARE_ASM_ALIGNED(16, const xmm_reg, ff_pw_5) = { 0x0005000500050005ULL, 0x0005000500050005ULL }; DECLARE_ALIGNED(16, const xmm_reg, ff_pw_8) = { 0x0008000800080008ULL, 0x0008000800080008ULL }; DECLARE_ASM_ALIGNED(16, const xmm_reg, ff_pw_9) = { 0x0009000900090009ULL, 0x0009000900090009ULL }; @@ -49,6 +53,7 @@ DECLARE_ALIGNED(32, const ymm_reg, ff_pw_256) = { 0x0100010001000100ULL, 0x010 DECLARE_ALIGNED(32, const ymm_reg, ff_pw_512) = { 0x0200020002000200ULL, 0x0200020002000200ULL, 0x0200020002000200ULL, 0x0200020002000200ULL }; DECLARE_ALIGNED(16, const xmm_reg, ff_pw_1019) = { 0x03FB03FB03FB03FBULL, 0x03FB03FB03FB03FBULL }; +attribute_mcmodel_small DECLARE_ALIGNED(32, const ymm_reg, ff_pw_1023) = { 0x03ff03ff03ff03ffULL, 0x03ff03ff03ff03ffULL, 0x03ff03ff03ff03ffULL, 0x03ff03ff03ff03ffULL}; DECLARE_ALIGNED(32, const ymm_reg, ff_pw_1024) = { 0x0400040004000400ULL, 0x0400040004000400ULL, @@ -66,13 +71,16 @@ DECLARE_ALIGNED(32, const ymm_reg, ff_pw_m1) = { 0xFFFFFFFFFFFFFFFFULL, 0xFFF DECLARE_ALIGNED(32, const ymm_reg, ff_pb_0) = { 0x0000000000000000ULL, 0x0000000000000000ULL, 0x0000000000000000ULL, 0x0000000000000000ULL }; +attribute_mcmodel_small DECLARE_ALIGNED(32, const ymm_reg, ff_pb_1) = { 0x0101010101010101ULL, 0x0101010101010101ULL, 0x0101010101010101ULL, 0x0101010101010101ULL }; DECLARE_ALIGNED(32, const ymm_reg, ff_pb_2) = { 0x0202020202020202ULL, 0x0202020202020202ULL, 0x0202020202020202ULL, 0x0202020202020202ULL }; +attribute_mcmodel_small DECLARE_ALIGNED(32, const ymm_reg, ff_pb_3) = { 0x0303030303030303ULL, 0x0303030303030303ULL, 0x0303030303030303ULL, 0x0303030303030303ULL }; DECLARE_ALIGNED(32, const xmm_reg, ff_pb_15) = { 0x0F0F0F0F0F0F0F0FULL, 0x0F0F0F0F0F0F0F0FULL }; +attribute_mcmodel_small DECLARE_ALIGNED(32, const ymm_reg, ff_pb_80) = { 0x8080808080808080ULL, 0x8080808080808080ULL, 0x8080808080808080ULL, 0x8080808080808080ULL }; DECLARE_ALIGNED(32, const ymm_reg, ff_pb_FE) = { 0xFEFEFEFEFEFEFEFEULL, 0xFEFEFEFEFEFEFEFEULL, diff --git a/libavutil/attributes.h b/libavutil/attributes.h index 04c615c952..dfc35fa31e 100644 --- a/libavutil/attributes.h +++ b/libavutil/attributes.h @@ -40,6 +40,12 @@ # define AV_HAS_BUILTIN(x) 0 #endif +#ifdef __has_attribute +# define AV_HAS_ATTRIBUTE(x) __has_attribute(x) +#else +# define AV_HAS_ATTRIBUTE(x) 0 +#endif + #ifndef av_always_inline #if AV_GCC_VERSION_AT_LEAST(3,1) # define av_always_inline __attribute__((always_inline)) inline diff --git a/libavutil/attributes_internal.h b/libavutil/attributes_internal.h index bc85ce77ff..c557fa0af0 100644 --- a/libavutil/attributes_internal.h +++ b/libavutil/attributes_internal.h @@ -19,6 +19,7 @@ #ifndef AVUTIL_ATTRIBUTES_INTERNAL_H #define AVUTIL_ATTRIBUTES_INTERNAL_H +#include "config.h" #include "attributes.h" #if (AV_GCC_VERSION_AT_LEAST(4,0) || defined(__clang__)) && (defined(__ELF__) || defined(__MACH__)) @@ -33,4 +34,19 @@ #define EXTERN extern attribute_visibility_hidden +/** + * Some globals defined in C files are used from hardcoded asm that assumes small + * code model (that is, accessing these globals without GOT). This is a problem + * when FFMpeg is built with medium code model (-mcmodel=medium) which allocates + * all globals in a data section that's unreachable with PC relative instructions + * (small code model instruction sequence). We mark all such globals with this + * attribute_mcmodel_small to ensure assembly accessible globals continue to be + * allocated in sections reachable from PC relative instructions. + */ +#if ARCH_X86_64 && defined(__ELF__) && AV_HAS_ATTRIBUTE(model) +# define attribute_mcmodel_small __attribute__((model("small"))) +#else +# define attribute_mcmodel_small +#endif + #endif /* AVUTIL_ATTRIBUTES_INTERNAL_H */ -- 2.49.0.rc0.332.g42c0ae87b1-goog _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".