On Wed, Feb 19, 2014 at 7:15 AM, Saul Tamari <stamari@xxxxxxxxx> 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@xxxxxxxxxx> wrote: >> On Wed, Feb 19, 2014 at 5:57 AM, Saul Tamari <stamari@xxxxxxxxx> 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