From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 65676 invoked by alias); 18 Aug 2015 21:14:21 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 65634 invoked by uid 89); 18 Aug 2015 21:14:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-vk0-f48.google.com Received: from mail-vk0-f48.google.com (HELO mail-vk0-f48.google.com) (209.85.213.48) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-GCM-SHA256 encrypted) ESMTPS; Tue, 18 Aug 2015 21:14:17 +0000 Received: by vkao123 with SMTP id o123so14648725vka.3 for ; Tue, 18 Aug 2015 14:14:15 -0700 (PDT) MIME-Version: 1.0 X-Received: by 10.52.113.40 with SMTP id iv8mr11412856vdb.28.1439932454945; Tue, 18 Aug 2015 14:14:14 -0700 (PDT) Received: by 10.31.31.23 with HTTP; Tue, 18 Aug 2015 14:14:14 -0700 (PDT) In-Reply-To: References: Date: Tue, 18 Aug 2015 21:19:00 -0000 Message-ID: Subject: Re: [RFC] COMDAT Safe Module Level Multi versioning From: Cary Coutant To: Sriraman Tallam Cc: Xinliang David Li , Richard Biener , "H.J. Lu" , GCC Patches , binutils , Yury Gribov Content-Type: text/plain; charset=UTF-8 X-IsSubscribed: yes X-SW-Source: 2015-08/txt/msg01033.txt.bz2 >>>> Based on Richard's suggestion, I have a patch to localize comdat >>>> functions which seems like a very effective solution to this problem. >>>> The text size increase is limited to the extra comdat copies generated >>>> for the specialized modules (modules with unsafe options) which is >>>> usually only a few. Since -fweak does something similar for >>>> functions, I have called the new option -fweak-comdat-functions. >>>> This does not apply to virtual comdat functions as their addresses can >>>> always be leaked via the vtable. Using this flag with virtual >>>> functions generates a warning. +fweak-comdat-functions +C++ Var(flag_weak_comdat_functions) Init(1) +Specific to comdat functions(-fno-weak-comdat-functions : Localize Comdat Functions). +With -fno-weak-comdat-functions, virtual comdat functions are still linked as +weak functions. With -fno-weak-comdat-functions, the address of the comdat +functions that are localized will be unique and this can cause unintended +behavior when addresses of comdat functions are used. Is one of those "With -fno-weak-comdat-functions" supposed to be "With -fweak-comdat-functions"? This description doesn't really say what the flag (without the "no") does, and doesn't explain what "localize" means. +@item -fno-weak-comdat-functions +@opindex fno-weak-comdat-functions +Do not use weak symbol support for comdat non-virtual functions, even if it +is provided by the linker. By default, G++ uses weak symbols if they are +available. This option is useful when comdat functions generated in certain +compilation units need to be kept local to the respective units and not exposed +globally. This does not apply to virtual comdat functions as their pointers +may be taken via virtual tables. This can cause unintended behavior if +the addresses of comdat functions are used. It's not really the "weak" that is causing the problem -- it's the "comdat". What the option really is doing is making the functions static rather than comdat. (It's all gated under flag_weak because weak symbols are the fall-back to link-once and comdat symbols.) I'd suggest phrasing this more in terms of static vs. comdat. This looks like the right way to go, though. -cary