public inbox for gcc-help@gcc.gnu.org
 help / color / mirror / Atom feed
From: Saul Tamari <stamari@gmail.com>
To: Ian Lance Taylor <iant@google.com>
Cc: "gcc-help@gcc.gnu.org" <gcc-help@gcc.gnu.org>
Subject: Re: Moving C++ code to a different ELF section
Date: Wed, 19 Feb 2014 17:27:00 -0000	[thread overview]
Message-ID: <CAGqvRw6Y-oHK_PmpeLeq=rVmD8DQ-QH=E-8n4s4B4A1jowAaag@mail.gmail.com> (raw)
In-Reply-To: <CAKOQZ8yEL4kZNZCiMz0-VoVVM_NUe59xLzWmH+voXGJr+21s4g@mail.gmail.com>

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 <iant@google.com> wrote:
> On Wed, Feb 19, 2014 at 7:15 AM, Saul Tamari <stamari@gmail.com> 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 <iant@google.com> wrote:
>>> On Wed, Feb 19, 2014 at 5:57 AM, Saul Tamari <stamari@gmail.com> 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 <iostream>
>>>> #include <stdlib.h>
>>>>
>>>> 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

  reply	other threads:[~2014-02-19 17:27 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-02-19 13:57 Saul Tamari
2014-02-19 14:11 ` Ian Lance Taylor
2014-02-19 15:15   ` Saul Tamari
2014-02-19 17:01     ` Ian Lance Taylor
2014-02-19 17:27       ` Saul Tamari [this message]
2014-02-19 17:45         ` Ian Lance Taylor
2014-02-19 18:21           ` Saul Tamari

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='CAGqvRw6Y-oHK_PmpeLeq=rVmD8DQ-QH=E-8n4s4B4A1jowAaag@mail.gmail.com' \
    --to=stamari@gmail.com \
    --cc=gcc-help@gcc.gnu.org \
    --cc=iant@google.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).