On Thu, Feb 21, 2013 at 04:37:48PM +0400, Konstantin Vladimirov wrote:
> Hi,
>
> Can you please make more clear why possible self-modifying code in
> proxy2 blocks optimization of caller function? We just sending control
> from caller to proxy1 or proxy2 and saying goodbye. Am I missed
> something?
It is on only at caller function. It could be at unrelated part like
here.
bar(){
*((char*)proxy1)=42;
}
foo(unsigned int* codeBuffer, unsigned int oper){
if (oper) bar();
myFunc(codeBuffer,oper);
}
With static it at least possible to check if address of function is
used in compilation unit which cannot be done at general.
>
> ---
> With best regards, Konstantin
>
> On Thu, Feb 21, 2013 at 4:25 PM, Ondřej Bílka <[email protected]> wrote:
> > On Thu, Feb 21, 2013 at 03:58:56PM +0400, Konstantin Vladimirov wrote:
> >> Hi,
> >>
> >> Sorry, mistyped. Please read `jne` instead of `je` in handwritten
> >> "optimized" assembler.
> >>
> >> ---
> >> With best regards, Konstantin
> >>
> >> On Thu, Feb 21, 2013 at 3:57 PM, Konstantin Vladimirov
> >> <[email protected]> wrote:
> >> > Hi,
> >> >
> >> > Discovered this optimization possibilty on private backend, but can
> >> > easily reproduce on x86
> >> >
> >> > Consider code, say test.c:
> >> >
> >> > static __attribute__((noinline)) unsigned int*
> >> > proxy1( unsigned int* codeBuffer, unsigned int oper, unsigned int a,
> >> > unsigned in
> >> > {
> >> > return codeBuffer;
> >> > }
> >> >
> >> > static __attribute__((noinline)) unsigned int*
> >> > proxy2( unsigned int* codeBuffer, unsigned int oper, unsigned int a,
> >> > unsigned in
> >> > {
> >> > return codeBuffer;
> >> > }
> >> >
> >> > __attribute__((noinline)) unsigned int*
> >> > myFunc( unsigned int* codeBuffer, unsigned int oper)
> >> > {
> >> > if( (oper & 0xF) == 14)
> >> > {
> >> > return proxy1( codeBuffer, oper, 0x22, 0x2102400b);
> >> > }
> >> > else
> >> > {
> >> > return proxy2( codeBuffer, oper, 0x22, 0x1102400b);
> >> > }
> >> > }
> >
> > This cannot be done in general as proxy1 could be self-modifying code.
> >
> > I considered writing post optimizer of binaries but I do not know how
> > detect self-modifying behaviour so what I can do is limited.