Fixture 10
cpp runtime shapes
C++ · 28 functions · 4 lanes · 20 of 71 function-lanes behave identically
4 of 4 lanes have a function that returns a different result after decompilation: gcc-O0 (5/26), clang-O0 (5/20), gcc-O2 (5/14), clang-O2 (5/11).
C++ runtime-shape fixture (compile with g++). Exercises the compiler-generated runtime shapes a decompiler must recover — virtual dispatch (vtables), constructor/destructor sequencing, RAII cleanup, exception unwinding (throw / try-catch), a capturing lambda, and a move — WITHOUT any STL (<vector>/<string> etc.). The target is the generated runtime machinery, not library functions.
Each shape is wrapped in an extern "C" function that takes/returns plain ints (and, for observable side effects, an int* out-parameter receiving an 8-int buffer), so an execution-differential harness can drive every shape by C symbol name and diff the return value plus any buffer writes.
Differential vs. structural: - The extern "C" wrappers (cpp_virtual_dispatch, cpp_ctor_dtor, cpp_raii_guard, cpp_exception, cpp_lambda_capture, cpp_move): DIFFERENTIAL. Deterministic; return unique ints per path; ctor/dtor/RAII side effects are made observable through the int* out-parameter. - The underlying shapes themselves — the vtable layout / virtual-call dispatch, and the exception-handling (landing pad / unwind) tables — are STRUCTURAL assertions: the harness checks that a virtual call stays an indirect vtable dispatch and that throw/catch keeps its EH structure, which the differential return values corroborate but do not fully pin down.
No floats. No STL. Deterministic throughout.
/* 10_cpp_runtime_shapes.cpp
*
* C++ runtime-shape fixture (compile with g++). Exercises the compiler-generated
* runtime shapes a decompiler must recover — virtual dispatch (vtables),
* constructor/destructor sequencing, RAII cleanup, exception unwinding
* (throw / try-catch), a capturing lambda, and a move — WITHOUT any STL
* (<vector>/<string> etc.). The target is the generated runtime machinery, not
* library functions.
*
* Each shape is wrapped in an `extern "C"` function that takes/returns plain
* ints (and, for observable side effects, an int* out-parameter receiving an
* 8-int buffer), so an execution-differential harness can drive every shape by C
* symbol name and diff the return value plus any buffer writes.
*
* Differential vs. structural:
* - The extern "C" wrappers (cpp_virtual_dispatch, cpp_ctor_dtor,
* cpp_raii_guard, cpp_exception, cpp_lambda_capture, cpp_move): DIFFERENTIAL.
* Deterministic; return unique ints per path; ctor/dtor/RAII side effects are
* made observable through the int* out-parameter.
* - The underlying shapes themselves — the vtable layout / virtual-call
* dispatch, and the exception-handling (landing pad / unwind) tables — are
* STRUCTURAL assertions: the harness checks that a virtual call stays an
* indirect vtable dispatch and that throw/catch keeps its EH structure, which
* the differential return values corroborate but do not fully pin down.
*
* No floats. No STL. Deterministic throughout.
*/
/* --- virtual dispatch: base / derived with a virtual method ------------- */
struct Base {
virtual int op(int x) { return x + 1000; }
virtual ~Base() {}
};
struct Derived : Base {
int op(int x) override { return x + 2000; }
};
/* sel picks the dynamic type; the call through the Base* is a virtual dispatch
* whose result differs by type, so a mis-recovered vtable index diverges. */
extern "C" int cpp_virtual_dispatch(int sel, int x) {
Base b;
Derived d;
Base *p = (sel & 1) ? static_cast<Base *>(&d) : &b;
return p->op(x); /* 2000+x for odd sel, 1000+x for even */
}
/* --- constructor / destructor with an observable side effect ------------ */
/* Writes a marker on construction and another on destruction into a caller
* buffer, so ctor/dtor sequencing becomes observable and differential. */
struct Tracer {
int *log;
int idx;
int tag;
Tracer(int *l, int i, int t) : log(l), idx(i), tag(t) {
log[idx] = tag + 1; /* construction marker */
}
~Tracer() {
log[idx + 1] = tag + 2; /* destruction marker */
}
};
/* out must point to an 8-int buffer. Records ctor then dtor markers and returns
* a deterministic code. */
extern "C" int cpp_ctor_dtor(int *out, int tag) {
{
Tracer t(out, 0, tag); /* out[0] = tag+1 at ctor */
out[2] = tag + 10; /* body marker, before dtor */
} /* out[1] = tag+2 at dtor (scope exit) */
return out[0] + out[1] + out[2];
}
/* --- RAII cleanup: a guard whose destructor writes to a given int* ------ */
struct Guard {
int *slot;
int value;
Guard(int *s, int v) : slot(s), value(v) {}
~Guard() { *slot = value; } /* cleanup effect on scope exit */
};
/* out is an 8-int buffer. The guard's destructor writes `value` into out[0]
* when the scope ends; observing that write is the differential signal. */
extern "C" int cpp_raii_guard(int *out, int value) {
out[0] = 0; /* pre-cleanup sentinel */
{
Guard g(out, value + 700);
out[1] = 42; /* proves body ran before cleanup */
} /* g.~Guard() writes out[0] = value+700 */
return out[0];
}
/* --- exception: throw and a try/catch returning a distinct code --------- */
static int may_throw(int x) {
if (x < 0)
throw x; /* triggers unwind */
return x + 5;
}
/* Distinct return on the caught vs. normal path exercises the EH tables. */
extern "C" int cpp_exception(int x) {
try {
return may_throw(x) + 3000; /* normal path: x+5+3000 */
} catch (int e) {
return 9000 - e; /* caught path: unique, depends on thrown value */
}
}
/* --- capturing lambda invoked immediately ------------------------------- */
/* The lambda captures `x` by value and a local by reference; invoking it builds
* and calls the compiler-generated closure type. */
extern "C" int cpp_lambda_capture(int x, int y) {
int acc = 0;
auto f = [x, &acc](int z) {
acc += x * z; /* uses by-value capture, mutates by-ref capture */
return x + z;
};
int r = f(y);
return r + acc; /* (x+y) + (x*y): unique per (x,y) */
}
/* --- move operation ----------------------------------------------------- */
/* A type with distinct copy vs. move behavior: moving zeroes the source and
* flags the destination, so whether a move (not a copy) occurred is observable. */
struct Movable {
int v;
int moved_in;
Movable(int val) : v(val), moved_in(0) {}
Movable(const Movable &o) : v(o.v), moved_in(0) {} /* copy: flag stays 0 */
Movable(Movable &&o) : v(o.v), moved_in(1) { o.v = 0; } /* move: flag=1, source zeroed */
};
static int consume(Movable m) {
return m.v + (m.moved_in ? 50 : 0);
}
/* Constructs a Movable and passes it via std::move-equivalent cast, so the move
* constructor runs; the moved_in flag makes that observable in the return. */
extern "C" int cpp_move(int val) {
Movable src(val);
int r = consume(static_cast<Movable &&>(src)); /* forces move ctor */
return r + src.v; /* src.v zeroed by move => r only; r == val+50 */
} Recovered C
Generated by glaurung decompile --style decbench at b47f6b43.
baseline.json records the result after recompiling the C and calling it beside the
original with seeded inputs.
gcc -O0
5/26_ZN4Base2opEi structural 7 lines
// glaurung: _ZN4Base2opEi @ 0x26b2
typedef struct Base Base;
int _ZN4Base2opEi(const Base * arg0, int arg1) {
// x86-64 prologue: save rbp
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(arg1)) + 1000));
} _ZN4BaseD0Ev structural 13 lines
// glaurung: _ZN4BaseD0Ev @ 0x26ee
typedef struct Base Base;
struct Base;
void _ZN4BaseD0Ev(const Base * arg0) {
extern void _ZN4BaseD1Ev(const struct Base *);
extern long _ZdlPvm(char *, int);
long var2;
// x86-64 prologue: save rbp, frame 16 bytes
((void (*)(char *))_ZN4BaseD1Ev)((char *)(arg0));
var2 = _ZdlPvm((char *)(arg0), 8);
// x86-64 epilogue: restore rbp
return;
} _ZN4BaseD1Ev structural
Glaurung recovered no body in this lane.
_ZN4BaseD2Ev structural 10 lines
// glaurung: _ZN4BaseD2Ev @ 0x26cc
typedef struct Base Base;
static unsigned char glaurung_global_4fd8[16] __attribute__((aligned(16)));
void _ZN4BaseD2Ev(const Base * arg0) {
extern unsigned char glaurung_global_4fd8[16];
// x86-64 prologue: save rbp
*(long *)(((long)arg0)) = (*(long *)(&glaurung_global_4fd8[0]) + 16);
// x86-64 epilogue: restore rbp
return;
} _ZN5GuardC1EPii structural
Glaurung recovered no body in this lane.
_ZN5GuardC2EPii structural 16 lines
// glaurung: _ZN5GuardC2EPii @ 0x27ca
#ifndef GLAURUNG_STRUCT_Guard_DEFINED
#define GLAURUNG_STRUCT_Guard_DEFINED
typedef struct Guard Guard;
struct Guard {
int * slot;
int value;
};
#endif
void _ZN5GuardC2EPii(const Guard * arg0, int * arg1, int arg2) {
// x86-64 prologue: save rbp
arg0->slot = (long)((long)arg1);
arg0->value = arg2;
// x86-64 epilogue: restore rbp
return;
} _ZN5GuardD1Ev structural
Glaurung recovered no body in this lane.
_ZN5GuardD2Ev structural 15 lines
// glaurung: _ZN5GuardD2Ev @ 0x27f6
#ifndef GLAURUNG_STRUCT_Guard_DEFINED
#define GLAURUNG_STRUCT_Guard_DEFINED
typedef struct Guard Guard;
struct Guard {
int * slot;
int value;
};
#endif
void _ZN5GuardD2Ev(const Guard * arg0) {
// x86-64 prologue: save rbp
*(int *)(*(long *)((long)arg0)) = arg0->value;
// x86-64 epilogue: restore rbp
return;
} _ZN6TracerC1EPiii structural
Glaurung recovered no body in this lane.
_ZN6TracerC2EPiii structural 19 lines
// glaurung: _ZN6TracerC2EPiii @ 0x2738
#ifndef GLAURUNG_STRUCT_Tracer_DEFINED
#define GLAURUNG_STRUCT_Tracer_DEFINED
typedef struct Tracer Tracer;
struct Tracer {
int * log;
int idx;
int tag;
};
#endif
void _ZN6TracerC2EPiii(const Tracer * arg0, int * arg1, int arg2, int arg3) {
// x86-64 prologue: save rbp
arg0->log = (long)((long)arg1);
arg0->idx = arg2;
arg0->tag = arg3;
*(int *)((((long)((int)(*(int *)(((long)arg0 + 0x8)))) << 2) + *(long *)((long)arg0))) = ((unsigned long)((unsigned int)(arg0->tag)) + 1);
// x86-64 epilogue: restore rbp
return;
} _ZN6TracerD1Ev structural
Glaurung recovered no body in this lane.
_ZN6TracerD2Ev structural 16 lines
// glaurung: _ZN6TracerD2Ev @ 0x2794
#ifndef GLAURUNG_STRUCT_Tracer_DEFINED
#define GLAURUNG_STRUCT_Tracer_DEFINED
typedef struct Tracer Tracer;
struct Tracer {
int * log;
int idx;
int tag;
};
#endif
void _ZN6TracerD2Ev(const Tracer * arg0) {
// x86-64 prologue: save rbp
*(int *)(((((long)((int)(*(int *)(((long)arg0 + 0x8)))) + 1) << 2) + *(long *)((long)arg0))) = ((unsigned long)((unsigned int)(arg0->tag)) + 2);
// x86-64 epilogue: restore rbp
return;
} _ZN7Derived2opEi structural 7 lines
// glaurung: _ZN7Derived2opEi @ 0x271e
typedef struct Derived Derived;
int _ZN7Derived2opEi(const Derived * arg0, int arg1) {
// x86-64 prologue: save rbp
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(arg1)) + 2000));
} _ZN7DerivedD0Ev structural 13 lines
// glaurung: _ZN7DerivedD0Ev @ 0x28a2
typedef struct Derived Derived;
struct Derived;
void _ZN7DerivedD0Ev(const Derived * arg0) {
extern void _ZN7DerivedD1Ev(const struct Derived *);
extern long _ZdlPvm(char *, int);
long var2;
// x86-64 prologue: save rbp, frame 16 bytes
((void (*)(char *))_ZN7DerivedD1Ev)((char *)(arg0));
var2 = _ZdlPvm((char *)(arg0), 8);
// x86-64 epilogue: restore rbp
return;
} _ZN7DerivedD1Ev structural
Glaurung recovered no body in this lane.
_ZN7DerivedD2Ev structural 13 lines
// glaurung: _ZN7DerivedD2Ev @ 0x2870
typedef struct Derived Derived;
struct Base;
static unsigned char glaurung_global_4fe0[16] __attribute__((aligned(16)));
void _ZN7DerivedD2Ev(const Derived * arg0) {
extern void _ZN4BaseD2Ev(const struct Base *);
extern unsigned char glaurung_global_4fe0[16];
// x86-64 prologue: save rbp, frame 16 bytes
*(long *)((long)arg0) = (*(long *)(&glaurung_global_4fe0[0]) + 16);
((void (*)(char *))_ZN4BaseD2Ev)((char *)(arg0));
// x86-64 epilogue: restore rbp
return;
} _ZN7MovableC1EOS_ structural
Glaurung recovered no body in this lane.
_ZN7MovableC1Ei structural
Glaurung recovered no body in this lane.
_ZN7MovableC2EOS_ structural 9 lines
// glaurung: _ZN7MovableC2EOS_ @ 0x283c
void _ZN7MovableC2EOS_(char * arg0, int * arg1) {
// x86-64 prologue: save rbp
*(int *)((long)arg0) = *(int *)((long)arg1);
*(int *)(((long)arg0 + 0x4)) = 1;
*(int *)((long)arg1) = 0;
// x86-64 epilogue: restore rbp
return;
} _ZN7MovableC2Ei structural 16 lines
// glaurung: _ZN7MovableC2Ei @ 0x2816
#ifndef GLAURUNG_STRUCT_Movable_DEFINED
#define GLAURUNG_STRUCT_Movable_DEFINED
typedef struct Movable Movable;
struct Movable {
int v;
int moved_in;
};
#endif
void _ZN7MovableC2Ei(const Movable * arg0, int arg1) {
// x86-64 prologue: save rbp
arg0->v = arg1;
arg0->moved_in = 0;
// x86-64 epilogue: restore rbp
return;
} cpp_ctor_dtor pass 21 lines
// glaurung: cpp_ctor_dtor @ 0x23cd
struct Tracer;
int cpp_ctor_dtor(int * arg0, int arg1) {
extern void _ZN6TracerC1EPiii(const struct Tracer *, int *, int, int);
extern void _ZN6TracerD1Ev(const struct Tracer *);
extern __attribute__((noreturn)) void __stack_chk_fail(void);
unsigned char local_20[16];
long local_8;
long ret;
// x86-64 prologue: save rbp, frame 48 bytes
local_8 = (long)(0x28);
((void (*)(char *, int *, int, int))_ZN6TracerC1EPiii)((char *)(&local_20[0]), arg0, 0, (unsigned long)((unsigned int)(arg1)));
*(int *)((arg0 + 2)) = ((unsigned long)((unsigned int)(arg1)) + 10);
((void (*)(char *))_ZN6TracerD1Ev)((char *)(&local_20[0]));
ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((arg0 + 2)))) + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((long)arg0))) + (unsigned long)((unsigned int)(*(int *)((arg0 + 1))))))))));
if ((local_8 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} cpp_exception pass 38 lines
// glaurung: cpp_exception @ 0x251a
int cpp_exception(int arg0) {
extern int _ZL9may_throwi(int);
int e;
int local_14;
int local_24;
long ret;
long t2;
long var0;
long var1;
long var10;
int var11;
int var12;
long var13;
long var3;
try {
// x86-64 prologue: save rbp, frame 8 bytes
local_24 = arg0;
var0 = (unsigned long)((unsigned int)(local_24));
var1 = ((long (*)(long))_ZL9may_throwi)((unsigned long)((unsigned int)(var0)));
var3 = (unsigned long)((unsigned int)((var1 + 3000)));
L_253a: ;
ret = (unsigned long)((unsigned int)(var3));
// x86-64 epilogue: restore rbp
return ret;
} catch (int exception_0) {
var10 = (unsigned long)((unsigned int)(exception_0));
local_14 = var10;
var11 = 0x2328;
t2 = local_14;
var12 = (var11 - t2);
var13 = (unsigned long)((unsigned int)(var12));
var3 = (unsigned long)((unsigned int)(var13));
ret = (unsigned long)((unsigned int)(var3));
// x86-64 epilogue: restore rbp
return ret;
}
} cpp_lambda_capture pass 25 lines
// glaurung: cpp_lambda_capture @ 0x25ae
struct anon_574;
int cpp_lambda_capture(int arg0, int arg1) {
extern int _ZZ18cpp_lambda_captureENKUliE_clEi(const struct anon_574 *, int);
extern __attribute__((noreturn)) void __stack_chk_fail(void);
unsigned char acc[8];
int r;
unsigned char local_20[16];
long local_8;
long ret;
int var7;
// x86-64 prologue: save rbp, frame 64 bytes
local_8 = (long)(0x28);
*(int *)(&acc[0]) = 0;
*(int *)(&local_20[0]) = arg0;
*(long *)((&local_20[0] + 8)) = (long)((long)(&acc[0]));
var7 = ((int (*)(char *, int))_ZZ18cpp_lambda_captureENKUliE_clEi)((char *)(&local_20[0]), (unsigned long)((unsigned int)(arg1)));
r = var7;
ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(r)) + (unsigned long)((unsigned int)(*(int *)(&acc[0]))))));
if ((local_8 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} cpp_move pass 26 lines
// glaurung: cpp_move @ 0x2643
struct Movable;
int cpp_move(int arg0) {
extern int _ZL7consume7Movable(int *);
extern void _ZN7MovableC1EOS_(char *, int *);
extern void _ZN7MovableC1Ei(const struct Movable *, int);
extern __attribute__((noreturn)) void __stack_chk_fail(void);
int r;
unsigned char local_10[8];
unsigned char local_18[8];
long local_8;
long ret;
int var8;
// x86-64 prologue: save rbp, frame 48 bytes
local_8 = (long)(0x28);
((void (*)(char *, int))_ZN7MovableC1Ei)((char *)(&local_18[0]), (unsigned long)((unsigned int)(arg0)));
_ZN7MovableC1EOS_((char *)(&local_10[0]), (int *)(&local_18[0]));
var8 = _ZL7consume7Movable((int *)(&local_10[0]));
r = var8;
ret = (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(r)) + (unsigned long)((unsigned int)(*(int *)(&local_18[0]))))));
if ((local_8 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} cpp_raii_guard pass 22 lines
// glaurung: cpp_raii_guard @ 0x2459
struct Guard;
int cpp_raii_guard(int * arg0, int arg1) {
extern void _ZN5GuardC1EPii(const struct Guard *, int *, int);
extern void _ZN5GuardD1Ev(const struct Guard *);
extern __attribute__((noreturn)) void __stack_chk_fail(void);
unsigned char local_20[16];
long local_8;
long ret;
// x86-64 prologue: save rbp, frame 48 bytes
local_8 = (long)(0x28);
*(int *)((long)arg0) = 0;
((void (*)(char *, int *, int))_ZN5GuardC1EPii)((char *)(&local_20[0]), arg0, (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) + 700))));
*(int *)((arg0 + 1)) = 42;
((void (*)(char *))_ZN5GuardD1Ev)((char *)(&local_20[0]));
ret = (unsigned long)((unsigned int)(*(int *)((long)arg0)));
if ((local_8 != 0x28)) {
__stack_chk_fail();
}
// x86-64 epilogue: restore rbp
return ret;
} cpp_virtual_dispatch structural 45 lines
// glaurung: cpp_virtual_dispatch @ 0x22fa
typedef struct Base Base;
struct Base;
struct Derived;
static unsigned char glaurung_global_4fd8[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_4fe0[16] __attribute__((aligned(16)));
int cpp_virtual_dispatch(int arg0, int arg1) {
extern __attribute__((noreturn)) long _Unwind_Resume(long);
extern void _ZN4BaseD1Ev(const struct Base *);
extern void _ZN7DerivedD1Ev(const struct Derived *);
extern __attribute__((noreturn)) void __stack_chk_fail(void);
extern unsigned char glaurung_global_4fd8[16];
extern unsigned char glaurung_global_4fe0[16];
Base * p;
long local_18;
unsigned char local_28[8];
unsigned char local_30[8];
long ret;
long var16;
long var17;
long var18;
long var24;
long var28;
// x86-64 prologue: save rbp, frame 8 bytes
local_18 = (long)(0x28);
*(long *)(&local_30[0]) = (*(long *)(&glaurung_global_4fd8[0]) + 16);
*(long *)(&local_28[0]) = (*(long *)(&glaurung_global_4fe0[0]) + 16);
p = (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 1))) != 0) ? (Base *)&local_28[0] : (Base *)&local_30[0]);
var16 = ((long (*)(char *, long))(*(long *)(*(long *)((long)p))))((char *)((long)p), (unsigned long)((unsigned int)(arg1)));
var17 = var16;
var18 = (unsigned long)((unsigned int)(var16));
((void (*)(char *))_ZN7DerivedD1Ev)((char *)(&local_28[0]));
((void (*)(char *))_ZN4BaseD1Ev)((char *)(&local_30[0]));
ret = (unsigned long)((unsigned int)(var18));
if ((local_18 == 0x28)) {
// x86-64 epilogue: restore rbp
return ret;
}
__stack_chk_fail();
// __glaurung_eh_landing_2398
var24 = var17;
((void (*)(char *))_ZN7DerivedD1Ev)((char *)(&local_28[0]));
((void (*)(char *))_ZN4BaseD1Ev)((char *)(&local_30[0]));
var28 = _Unwind_Resume(var24);
} clang -O0
5/20_ZN4Base2opEi structural 7 lines
// glaurung: _ZN4Base2opEi @ 0x16a0
typedef struct Base Base;
int _ZN4Base2opEi(Base * arg0, int arg1) {
// x86-64 prologue: save rbp
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(arg1)) + 1000));
} _ZN4BaseC2Ev structural 10 lines
// glaurung: _ZN4BaseC2Ev @ 0x1500
typedef struct Base Base;
static unsigned char glaurung_global_3fd8[16] __attribute__((aligned(16)));
void _ZN4BaseC2Ev(Base * arg0) {
extern unsigned char glaurung_global_3fd8[16];
// x86-64 prologue: save rbp
*(long *)(((long)arg0)) = (*(long *)(&glaurung_global_3fd8[0]) + 16);
// x86-64 epilogue: restore rbp
return;
} _ZN4BaseD0Ev structural 13 lines
// glaurung: _ZN4BaseD0Ev @ 0x16c0
typedef struct Base Base;
struct Base;
void _ZN4BaseD0Ev(Base * arg0) {
extern void _ZN4BaseD2Ev(struct Base *);
extern long _ZdlPv(char *);
long var1;
// x86-64 prologue: save rbp, frame 16 bytes
((void (*)(void))_ZN4BaseD2Ev)();
var1 = _ZdlPv((char *)(arg0));
// x86-64 epilogue: restore rbp
return;
} _ZN4BaseD2Ev structural 7 lines
// glaurung: _ZN4BaseD2Ev @ 0x1580
typedef struct Base Base;
void _ZN4BaseD2Ev(Base * arg0) {
// x86-64 prologue: save rbp
// x86-64 epilogue: restore rbp
return;
} _ZN5GuardC2EPii structural 18 lines
// glaurung: _ZN5GuardC2EPii @ 0x1600
#ifndef GLAURUNG_STRUCT_Guard_DEFINED
#define GLAURUNG_STRUCT_Guard_DEFINED
typedef struct Guard Guard;
struct Guard {
int * slot;
int value;
};
#endif
void _ZN5GuardC2EPii(Guard * arg0, int * arg1, int arg2) {
Guard * ret;
// x86-64 prologue: save rbp
ret = arg0;
arg0->slot = (long)((long)arg1);
arg0->value = arg2;
// x86-64 epilogue: restore rbp
return;
} _ZN5GuardD2Ev structural 15 lines
// glaurung: _ZN5GuardD2Ev @ 0x1630
#ifndef GLAURUNG_STRUCT_Guard_DEFINED
#define GLAURUNG_STRUCT_Guard_DEFINED
typedef struct Guard Guard;
struct Guard {
int * slot;
int value;
};
#endif
void _ZN5GuardD2Ev(Guard * arg0) {
// x86-64 prologue: save rbp
*(int *)(*(long *)((long)arg0)) = arg0->value;
// x86-64 epilogue: restore rbp
return;
} _ZN6TracerC2EPiii structural 21 lines
// glaurung: _ZN6TracerC2EPiii @ 0x1590
#ifndef GLAURUNG_STRUCT_Tracer_DEFINED
#define GLAURUNG_STRUCT_Tracer_DEFINED
typedef struct Tracer Tracer;
struct Tracer {
int * log;
int idx;
int tag;
};
#endif
void _ZN6TracerC2EPiii(Tracer * arg0, int * arg1, int arg2, int arg3) {
Tracer * var0;
// x86-64 prologue: save rbp
var0 = arg0;
arg0->log = (long)((long)arg1);
arg0->idx = arg2;
arg0->tag = arg3;
*(int *)((*(long *)(((long)var0)) + ((long)((int)(*(int *)(((long)var0 + 0x8)))) * 4))) = ((unsigned long)((unsigned int)(arg0->tag)) + 1);
// x86-64 epilogue: restore rbp
return;
} _ZN6TracerD2Ev structural 16 lines
// glaurung: _ZN6TracerD2Ev @ 0x15d0
#ifndef GLAURUNG_STRUCT_Tracer_DEFINED
#define GLAURUNG_STRUCT_Tracer_DEFINED
typedef struct Tracer Tracer;
struct Tracer {
int * log;
int idx;
int tag;
};
#endif
void _ZN6TracerD2Ev(Tracer * arg0) {
// x86-64 prologue: save rbp
*(int *)((*(long *)((long)arg0) + ((long)((int)(((unsigned long)((unsigned int)(*(int *)(((long)arg0 + 0x8)))) + 1))) * 4))) = ((unsigned long)((unsigned int)(arg0->tag)) + 2);
// x86-64 epilogue: restore rbp
return;
} _ZN7Derived2opEi structural 7 lines
// glaurung: _ZN7Derived2opEi @ 0x16f0
typedef struct Derived Derived;
int _ZN7Derived2opEi(Derived * arg0, int arg1) {
// x86-64 prologue: save rbp
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(arg1)) + 2000));
} _ZN7DerivedC2Ev structural 13 lines
// glaurung: _ZN7DerivedC2Ev @ 0x1520
typedef struct Derived Derived;
struct Base;
static unsigned char glaurung_global_3fe0[16] __attribute__((aligned(16)));
void _ZN7DerivedC2Ev(Derived * arg0) {
extern void _ZN4BaseC2Ev(struct Base *);
extern unsigned char glaurung_global_3fe0[16];
// x86-64 prologue: save rbp, frame 16 bytes
((void (*)(void))_ZN4BaseC2Ev)();
*(long *)(((long)arg0)) = (*(long *)(&glaurung_global_3fe0[0]) + 16);
// x86-64 epilogue: restore rbp
return;
} _ZN7DerivedD0Ev structural 13 lines
// glaurung: _ZN7DerivedD0Ev @ 0x1710
typedef struct Derived Derived;
struct Derived;
void _ZN7DerivedD0Ev(Derived * arg0) {
extern void _ZN7DerivedD2Ev(struct Derived *);
extern long _ZdlPv(char *);
long var1;
// x86-64 prologue: save rbp, frame 16 bytes
((void (*)(void))_ZN7DerivedD2Ev)();
var1 = _ZdlPv((char *)(arg0));
// x86-64 epilogue: restore rbp
return;
} _ZN7DerivedD2Ev structural 10 lines
// glaurung: _ZN7DerivedD2Ev @ 0x1560
typedef struct Derived Derived;
struct Base;
void _ZN7DerivedD2Ev(Derived * arg0) {
extern void _ZN4BaseD2Ev(struct Base *);
// x86-64 prologue: save rbp, frame 16 bytes
((void (*)(char *))_ZN4BaseD2Ev)((char *)(arg0));
// x86-64 epilogue: restore rbp
return;
} _ZN7MovableC2EOS_ structural 11 lines
// glaurung: _ZN7MovableC2EOS_ @ 0x1670
void _ZN7MovableC2EOS_(char * arg0, int * arg1) {
long var0;
// x86-64 prologue: save rbp
var0 = (long)arg0;
*(int *)((long)arg0) = *(int *)((long)arg1);
*(int *)((var0 + 0x4)) = 1;
*(int *)((long)arg1) = 0;
// x86-64 epilogue: restore rbp
return;
} _ZN7MovableC2Ei structural 18 lines
// glaurung: _ZN7MovableC2Ei @ 0x1650
#ifndef GLAURUNG_STRUCT_Movable_DEFINED
#define GLAURUNG_STRUCT_Movable_DEFINED
typedef struct Movable Movable;
struct Movable {
int v;
int moved_in;
};
#endif
void _ZN7MovableC2Ei(Movable * arg0, int arg1) {
Movable * ret;
// x86-64 prologue: save rbp
ret = arg0;
arg0->v = arg1;
arg0->moved_in = 0;
// x86-64 epilogue: restore rbp
return;
} cpp_ctor_dtor pass 13 lines
// glaurung: cpp_ctor_dtor @ 0x12b0
struct Tracer;
__attribute__((no_stack_protector)) int cpp_ctor_dtor(int * arg0, int arg1) {
extern void _ZN6TracerC2EPiii(struct Tracer *, int *, int, int);
extern void _ZN6TracerD2Ev(struct Tracer *);
unsigned char local_20[16];
// x86-64 prologue: save rbp, frame 32 bytes
((void (*)(char *, int *, int, int))_ZN6TracerC2EPiii)((char *)(&local_20[0]), arg0, 0, (unsigned long)((unsigned int)(arg1)));
*(int *)(((long)arg0 + 0x8)) = ((unsigned long)((unsigned int)(arg1)) + 10);
((void (*)(char *))_ZN6TracerD2Ev)((char *)(&local_20[0]));
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(*(int *)((long)arg0))) + *(int *)(((long)arg0 + 0x4))))) + *(int *)(((long)arg0 + 0x8))));
} cpp_exception pass 44 lines
// glaurung: cpp_exception @ 0x1360
int cpp_exception(int arg0) {
extern int _ZL9may_throwi(int);
int e;
int local_18;
int local_1c;
int local_4;
int local_8;
long ret;
long t2;
long var0;
long var12;
int var13;
int var14;
long var15;
long var2;
int var3;
long var4;
try {
// x86-64 prologue: save rbp, frame 32 bytes
local_8 = arg0;
var0 = ((long (*)(long))_ZL9may_throwi)((unsigned long)((unsigned int)(local_8)));
local_1c = var0;
var2 = (unsigned long)((unsigned int)(local_1c));
var3 = (var2 + 3000);
var4 = (unsigned long)((unsigned int)(var3));
local_4 = var4;
L_13c5: ;
ret = (unsigned long)((unsigned int)(local_4));
// x86-64 epilogue: restore rbp
return ret;
} catch (int exception_0) {
var12 = (unsigned long)((unsigned int)(exception_0));
local_18 = var12;
var13 = 0x2328;
t2 = local_18;
var14 = (var13 - t2);
var15 = (unsigned long)((unsigned int)(var14));
local_4 = var15;
ret = (unsigned long)((unsigned int)(local_4));
// x86-64 epilogue: restore rbp
return ret;
}
} cpp_lambda_capture pass 17 lines
// glaurung: cpp_lambda_capture @ 0x1430
struct anon_414;
__attribute__((no_stack_protector)) int cpp_lambda_capture(int arg0, int arg1) {
extern int _ZZ18cpp_lambda_captureENK3__0clEi(const struct anon_414 *, int);
unsigned char acc[12];
int r;
unsigned char local_20[16];
int var2;
// x86-64 prologue: save rbp, frame 48 bytes
*(int *)(&acc[0]) = 0;
*(int *)(&local_20[0]) = arg0;
*(long *)((&local_20[0] + 8)) = (long)((long)(&acc[0]));
var2 = ((int (*)(char *, int))_ZZ18cpp_lambda_captureENK3__0clEi)((char *)(&local_20[0]), (unsigned long)((unsigned int)(arg1)));
r = var2;
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(r)) + *(int *)(&acc[0])));
} cpp_move pass 18 lines
// glaurung: cpp_move @ 0x14a0
struct Movable;
__attribute__((no_stack_protector)) int cpp_move(int arg0) {
extern int _ZL7consume7Movable(int *);
extern void _ZN7MovableC2EOS_(char *, int *);
extern void _ZN7MovableC2Ei(struct Movable *, int);
int r;
unsigned char local_10[8];
unsigned char local_20[12];
int var0;
// x86-64 prologue: save rbp, frame 32 bytes
((void (*)(char *, int))_ZN7MovableC2Ei)((char *)(&local_10[0]), (unsigned long)((unsigned int)(arg0)));
_ZN7MovableC2EOS_((char *)(&local_20[0]), (int *)(&local_10[0]));
var0 = _ZL7consume7Movable((int *)(&local_20[0]));
r = var0;
// x86-64 epilogue: restore rbp
return (unsigned int)(((unsigned long)((unsigned int)(r)) + *(int *)(&local_10[0])));
} cpp_raii_guard pass 14 lines
// glaurung: cpp_raii_guard @ 0x1310
struct Guard;
__attribute__((no_stack_protector)) int cpp_raii_guard(int * arg0, int arg1) {
extern void _ZN5GuardC2EPii(struct Guard *, int *, int);
extern void _ZN5GuardD2Ev(struct Guard *);
unsigned char local_20[16];
// x86-64 prologue: save rbp, frame 32 bytes
*(int *)((long)arg0) = 0;
((void (*)(char *, int *, int))_ZN5GuardC2EPii)((char *)(&local_20[0]), arg0, (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) + 700))));
*(int *)(((long)arg0 + 0x4)) = 42;
((void (*)(char *))_ZN5GuardD2Ev)((char *)(&local_20[0]));
// x86-64 epilogue: restore rbp
return (unsigned int)(*(int *)((long)arg0));
} cpp_virtual_dispatch structural 27 lines
// glaurung: cpp_virtual_dispatch @ 0x1200
typedef struct Base Base;
struct Base;
struct Derived;
__attribute__((no_stack_protector)) int cpp_virtual_dispatch(int arg0, int arg1) {
extern void _ZN4BaseC2Ev(struct Base *);
extern void _ZN4BaseD2Ev(struct Base *);
extern void _ZN7DerivedC2Ev(struct Derived *);
extern void _ZN7DerivedD2Ev(struct Derived *);
unsigned char p[8];
unsigned char local_10[8];
unsigned char local_18[8];
void * local_38;
int local_3c;
long var10;
// x86-64 prologue: save rbp, frame 64 bytes
((void (*)(char *))_ZN4BaseC2Ev)((char *)(&local_10[0]));
((void (*)(char *))_ZN7DerivedC2Ev)((char *)(&local_18[0]));
local_38 = (((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) & 1))) != 0) ? &local_18[0] : &local_10[0]);
*(long *)(&p[0]) = (long)((long)local_38);
var10 = ((long (*)(void))(*(long *)(*(long *)(*(long *)(&p[0])))))();
local_3c = var10;
((void (*)(char *))_ZN7DerivedD2Ev)((char *)(&local_18[0]));
((void (*)(char *))_ZN4BaseD2Ev)((char *)(&local_10[0]));
// x86-64 epilogue: restore rbp
return (unsigned int)(local_3c);
} gcc -O2
5/14_ZN4Base2opEi structural 5 lines
// glaurung: _ZN4Base2opEi @ 0x1340
typedef struct Base Base;
int _ZN4Base2opEi(const Base * arg0, int arg1) {
return (unsigned int)((arg1 + 1000));
} _ZN4BaseD0Ev structural 8 lines
// glaurung: _ZN4BaseD0Ev @ 0x1390
typedef struct Base Base;
void _ZN4BaseD0Ev(const Base * arg0) {
extern long _ZdlPvm(void);
long var1;
var1 = _ZdlPvm();
return;
} _ZN4BaseD1Ev structural
Glaurung recovered no body in this lane.
_ZN4BaseD2Ev structural 5 lines
// glaurung: _ZN4BaseD2Ev @ 0x1350
typedef struct Base Base;
void _ZN4BaseD2Ev(const Base * arg0) {
return;
} _ZN7Derived2opEi structural 5 lines
// glaurung: _ZN7Derived2opEi @ 0x1360
typedef struct Derived Derived;
int _ZN7Derived2opEi(const Derived * arg0, int arg1) {
return (unsigned int)((arg1 + 2000));
} _ZN7DerivedD0Ev structural 8 lines
// glaurung: _ZN7DerivedD0Ev @ 0x1380
typedef struct Derived Derived;
void _ZN7DerivedD0Ev(const Derived * arg0) {
extern long _ZdlPvm(void);
long var1;
var1 = _ZdlPvm();
return;
} _ZN7DerivedD1Ev structural
Glaurung recovered no body in this lane.
_ZN7DerivedD2Ev structural 5 lines
// glaurung: _ZN7DerivedD2Ev @ 0x1370
typedef struct Derived Derived;
void _ZN7DerivedD2Ev(const Derived * arg0) {
return;
} cpp_ctor_dtor pass 13 lines
// glaurung: cpp_ctor_dtor @ 0x12c0
int cpp_ctor_dtor(int * arg0, int arg1) {
long var0;
long var1;
int var2;
var0 = (unsigned long)((unsigned int)((arg1 + 1)));
var1 = (unsigned long)((unsigned int)((arg1 + 10)));
var2 = (arg1 + 2);
*(int *)(((long)arg0 + 0x4)) = var2;
*(int *)(((long)arg0 + 0x8)) = var1;
*(int *)(((long)arg0)) = var0;
return (unsigned int)((var1 + (unsigned long)((unsigned int)(((unsigned long)((unsigned int)(var2)) + var0)))));
} cpp_exception pass 33 lines
// glaurung: cpp_exception @ 0x1300
int cpp_exception(int arg0) {
long ret;
int stack_0;
long t0;
long t1;
long t2;
long var0;
int var13;
int var14;
long var15;
try {
var0 = (unsigned long)((unsigned int)(arg0));
t0 = arg0;
t1 = (long)((int)(t0));
if ((t1 < 0)) {
throw (int)(var0);
}
ret = (unsigned long)((unsigned int)((arg0 + 3005)));
L_1319: ;
// x86-64 epilogue: tear down frame
return ret;
} catch (int exception_0) {
var13 = 0x2328;
t2 = exception_0;
var14 = (var13 - t2);
var15 = (unsigned long)((unsigned int)(var14));
stack_0 = var15;
ret = (unsigned long)((unsigned int)(stack_0));
// x86-64 epilogue: tear down frame
return ret;
}
} cpp_lambda_capture pass 5 lines
// glaurung: cpp_lambda_capture @ 0x1320
int cpp_lambda_capture(int arg0, int arg1) {
int r;
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg0)) * arg1))) + (unsigned long)((unsigned int)((arg0 + arg1)))));
} cpp_move pass 5 lines
// glaurung: cpp_move @ 0x1330
int cpp_move(int arg0) {
int r;
return (unsigned int)((arg0 + 50));
} cpp_raii_guard pass 8 lines
// glaurung: cpp_raii_guard @ 0x12e0
int cpp_raii_guard(int * arg0, int arg1) {
long ret;
ret = (unsigned long)((unsigned int)((arg1 + 700)));
*(int *)(((long)arg0 + 0x4)) = 42;
*(int *)(((long)arg0)) = ret;
return ret;
} cpp_virtual_dispatch structural 28 lines
// glaurung: cpp_virtual_dispatch @ 0x1240
typedef struct Base Base;
static unsigned char glaurung_global_3fc8[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_3fd0[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_3fd8[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_3fe0[16] __attribute__((aligned(16)));
int cpp_virtual_dispatch(int arg0, int arg1) {
extern __attribute__((noreturn)) void __stack_chk_fail(void);
extern unsigned char glaurung_global_3fc8[16];
extern unsigned char glaurung_global_3fd0[16];
extern unsigned char glaurung_global_3fd8[16];
extern unsigned char glaurung_global_3fe0[16];
Base * p;
long local_10;
unsigned char local_18[8];
unsigned char local_20[8];
long ret;
long var11;
local_10 = (long)(0x28);
*(long *)(&local_20[0]) = (*(long *)(&glaurung_global_3fc8[0]) + 16);
*(long *)(&local_18[0]) = (*(long *)(&glaurung_global_3fe0[0]) + 16);
var11 = ((long (*)(void))((((unsigned long)((unsigned int)((arg0 & 1))) != 0) ? *(long *)(&glaurung_global_3fd0[0]) : *(long *)(&glaurung_global_3fd8[0]))))();
ret = var11;
if ((local_10 != 0x28)) {
__stack_chk_fail();
}
return ret;
} clang -O2
5/11_ZN4Base2opEi structural 5 lines
// glaurung: _ZN4Base2opEi @ 0x1240
typedef struct Base Base;
int _ZN4Base2opEi(Base * arg0, int arg1) {
return (unsigned int)((arg1 + 1000));
} _ZN4BaseD0Ev structural 8 lines
// glaurung: _ZN4BaseD0Ev @ 0x1250
typedef struct Base Base;
void _ZN4BaseD0Ev(Base * arg0) {
extern long _ZdlPv(char *);
long var0;
var0 = _ZdlPv((char *)(arg0));
return;
} _ZN4BaseD2Ev structural 5 lines
// glaurung: _ZN4BaseD2Ev @ 0x1230
typedef struct Base Base;
void _ZN4BaseD2Ev(Base * arg0) {
return;
} _ZN7Derived2opEi structural 5 lines
// glaurung: _ZN7Derived2opEi @ 0x1260
typedef struct Derived Derived;
int _ZN7Derived2opEi(Derived * arg0, int arg1) {
return (unsigned int)((arg1 + 2000));
} _ZN7DerivedD0Ev structural 8 lines
// glaurung: _ZN7DerivedD0Ev @ 0x1270
typedef struct Derived Derived;
void _ZN7DerivedD0Ev(Derived * arg0) {
extern long _ZdlPv(char *);
long var0;
var0 = _ZdlPv((char *)(arg0));
return;
} cpp_ctor_dtor pass 7 lines
// glaurung: cpp_ctor_dtor @ 0x1190
int cpp_ctor_dtor(int * arg0, int arg1) {
*(int *)(((long)arg0)) = (arg1 + 1);
*(int *)(((long)arg0 + 0x8)) = (arg1 + 10);
*(int *)(((long)arg0 + 0x4)) = (arg1 + 2);
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)((arg1 + arg1))) + 3))) + arg1))) + 10));
} cpp_exception pass 34 lines
// glaurung: cpp_exception @ 0x11c0
int cpp_exception(int arg0) {
long ret;
long t0;
long t1;
long t2;
long var0;
int var10;
int var11;
int var6;
long var7;
try {
var0 = (unsigned long)((unsigned int)(arg0));
t0 = arg0;
t1 = (long)((int)(t0));
if ((t1 < 0)) {
throw (int)(var0);
}
var6 = (var0 + 3005);
var7 = (unsigned long)((unsigned int)(var6));
L_11cd: ;
ret = (unsigned long)((unsigned int)(var7));
// x86-64 epilogue: tear down frame
return ret;
} catch (int exception_0) {
var10 = 0x2328;
t2 = exception_0;
var11 = (var10 - t2);
var7 = (unsigned long)((unsigned int)(var11));
ret = (unsigned long)((unsigned int)(var7));
// x86-64 epilogue: tear down frame
return ret;
}
} cpp_lambda_capture pass 5 lines
// glaurung: cpp_lambda_capture @ 0x1210
int cpp_lambda_capture(int arg0, int arg1) {
int acc;
return (unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(((unsigned long)((unsigned int)(arg1)) * arg0))) + arg1))) + arg0));
} cpp_move pass 5 lines
// glaurung: cpp_move @ 0x1220
int cpp_move(int arg0) {
int r;
return (unsigned int)((arg0 + 50));
} cpp_raii_guard pass 8 lines
// glaurung: cpp_raii_guard @ 0x11b0
int cpp_raii_guard(int * arg0, int arg1) {
long ret;
ret = (unsigned long)((unsigned int)((arg1 + 700)));
*(int *)(((long)arg0 + 0x4)) = 42;
*(int *)(((long)arg0)) = ret;
return ret;
} cpp_virtual_dispatch structural 18 lines
// glaurung: cpp_virtual_dispatch @ 0x1150
typedef struct Base Base;
static unsigned char glaurung_global_3fd8[16] __attribute__((aligned(16)));
static unsigned char glaurung_global_3fe0[16] __attribute__((aligned(16)));
__attribute__((no_stack_protector)) int cpp_virtual_dispatch(int arg0, int arg1) {
extern unsigned char glaurung_global_3fd8[16];
extern unsigned char glaurung_global_3fe0[16];
Base * p;
unsigned char local_10[16];
int ret;
long rsp;
rsp = (rsp - 24);
*(long *)((&local_10[0] + 8)) = (*(long *)(&glaurung_global_3fd8[0]) + 16);
*(long *)(&local_10[0]) = (*(long *)(&glaurung_global_3fe0[0]) + 16);
ret = ((int (*)(void))(*(long *)(*(long *)((((unsigned long)((unsigned char)((arg0 & 1))) == 0) ? (rsp + 16) : (long)(&local_10[0]))))))();
// x86-64 epilogue: tear down frame
return ret;
}