From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 25669 invoked by alias); 19 Feb 2014 17:27:03 -0000 Mailing-List: contact gcc-help-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-help-owner@gcc.gnu.org Received: (qmail 25655 invoked by uid 89); 19 Feb 2014 17:27:02 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.4 required=5.0 tests=AWL,BAYES_00,FREEMAIL_FROM,RCVD_IN_DNSWL_LOW,SPF_PASS autolearn=ham version=3.3.2 X-HELO: mail-qa0-f47.google.com Received: from mail-qa0-f47.google.com (HELO mail-qa0-f47.google.com) (209.85.216.47) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Wed, 19 Feb 2014 17:27:01 +0000 Received: by mail-qa0-f47.google.com with SMTP id j5so954372qaq.20 for ; Wed, 19 Feb 2014 09:26:59 -0800 (PST) MIME-Version: 1.0 X-Received: by 10.236.216.106 with SMTP id f100mr7220934yhp.129.1392830819527; Wed, 19 Feb 2014 09:26:59 -0800 (PST) Received: by 10.170.83.7 with HTTP; Wed, 19 Feb 2014 09:26:59 -0800 (PST) In-Reply-To: References: Date: Wed, 19 Feb 2014 17:27:00 -0000 Message-ID: Subject: Re: Moving C++ code to a different ELF section From: Saul Tamari To: Ian Lance Taylor Cc: "gcc-help@gcc.gnu.org" Content-Type: text/plain; charset=ISO-8859-1 X-SW-Source: 2014-02/txt/msg00111.txt.bz2 In the gcc manual the -freorder-blocks-and-partition description includes the following: "... This optimization is automatically turned off in the presence of exception handling, for linkonce sections, for functions with a user-defined section attribute and on any architecture that does not support named sections." I also tried compiling my application (which uses exceptions) with this flag and I don't see any new sections in the generated code. On Wed, Feb 19, 2014 at 12:01 PM, Ian Lance Taylor wrote: > On Wed, Feb 19, 2014 at 7:15 AM, Saul Tamari wrote: >> >> I am trying to see if moving mostly unused code (e.g. conditional >> debug print statements) to a different section (and to different >> pages) would impact performance in a large application. > > So, you want -freorder-blocks-and-partition. > > You can't do it using asm statements that change the section in ways > that the compiler doesn't know about. > > Ian > > >> On Wed, Feb 19, 2014 at 9:11 AM, Ian Lance Taylor wrote: >>> On Wed, Feb 19, 2014 at 5:57 AM, Saul Tamari wrote: >>>> >>>> I'm trying to move some C++ code to a different ELF section and am >>>> facing some errors which I don't understand. I'm using g++ v4.8.1 on >>>> x86. >>>> >>>> When compiling the following code I'm getting these errors: >>>> /tmp/ccpp2AkE.s: Assembler messages: >>>> /tmp/ccpp2AkE.s:63: Error: CFI instruction used without previous .cfi_startproc >>>> /tmp/ccpp2AkE.s:64: Error: CFI instruction used without previous .cfi_startproc >>>> /tmp/ccpp2AkE.s:66: Error: .cfi_endproc without corresponding .cfi_startproc >>>> /tmp/ccpp2AkE.s: Error: open CFI at the end of file; missing >>>> .cfi_endproc directive >>>> >>>> >>>> The source is: >>>> #include >>>> #include >>>> >>>> int qqq; >>>> >>>> int main(int argc, char* argv[]) >>>> { >>>> std::cout << "hey " << std::endl; >>>> >>>> qqq = rand(); >>>> if (qqq > 0x1000000) { >>>> asm volatile ("jmp 1f \n\t .pushsection >>>> __kuku,\"ax\",@progbits \n\t 1:"); >>>> std::cout << "0x123456" << std::endl; >>>> throw 12345; >>>> asm volatile("jmp 3f \n\t .popsection \n\t 3:"); >>>> } >>>> >>>> return 0; >>>> } >>>> >>>> >>>> What do these errors mean? Is there a way to fix them? Is there an >>>> alternate method to move similar code to a different section? >>> >>> The assembler errors occur because GCC emits debug info in the >>> assembler stream using CFI pseudo-ops, and you are moving the >>> pseudo-ops to a different section in a way that GCC does not >>> understand. The assembler is seeing CFI pseudo-ops that make no >>> sense, so it is giving errors about them. >>> >>> The approach you are using can not work. The compiler is not an >>> assembler. It does not issue instructions in precise sequence. It >>> copies and duplicates and rearranges instructions as it sees fit. >>> This is so even though you are using asm volatile. All the asm >>> volatile promises is that the string will appear at the right point in >>> execution sequence. Your strings can only work if they appear at the >>> right point in the assembler output. That is a different matter that >>> the compiler does not guarantee. >>> >>> You didn't see what you are trying to do, but at a guess you should >>> look at the -freorder-blocks-and-partition option. >>> >>> Ian