Mercurial > pub > dyncall > dyncall
comparison doc/disas_examples/x86.fastcall_gnu.disas @ 497:cb19b2fe2422
- more disas examples to check behaviour of passing C++ non-trivial aggregates by value; they all behave the same, calling the copy ctor first, passing a pointer then
author | Tassilo Philipp |
---|---|
date | Wed, 23 Mar 2022 15:24:31 +0100 |
parents | 79e76734bb5c |
children | fc614cb865c6 |
comparison
equal
deleted
inserted
replaced
496:da5232da6270 | 497:cb19b2fe2422 |
---|---|
277 1248: c9 leave ; | | 277 1248: c9 leave ; | |
278 1249: c3 ret ; | epilog | 278 1249: c3 ret ; | epilog |
279 | 279 |
280 | 280 |
281 | 281 |
282 ; ---------- C++ trivial and non-trivial aggrs passed to C funcs ----------> | |
283 ; | |
284 ; struct Trivial { int a; }; | |
285 ; struct NonTrivial { | |
286 ; int a; | |
287 ; __attribute__((fastcall)) NonTrivial() : a(0) {} | |
288 ; __attribute__((fastcall)) NonTrivial(const NonTrivial& rhs) : a(rhs.a) { } | |
289 ; }; | |
290 ; | |
291 ; extern "C" { | |
292 ; | |
293 ; void __attribute__((fastcall)) f1(struct Trivial s) { } | |
294 ; void __attribute__((fastcall)) f2(struct NonTrivial s) { } | |
295 ; | |
296 ; void __attribute__((fastcall)) f() | |
297 ; { | |
298 ; struct Trivial t; | |
299 ; struct NonTrivial n; | |
300 ; int a=1; | |
301 ; a += 123; | |
302 ; f1(t); | |
303 ; a -= 123; | |
304 ; f2(n); | |
305 ; a -= 12; | |
306 ; } | |
307 ; } | |
308 | |
309 | |
310 | |
311 ; output from alpine_linux-3.11.3-x86 w/ gcc 9.2.0 | |
312 | |
313 00001215 <f1>: | |
314 1215: 55 push %ebp | |
315 1216: 89 e5 mov %esp,%ebp | |
316 1218: e8 f0 ff ff ff call 120d <__x86.get_pc_thunk.ax> | |
317 121d: 05 af 2d 00 00 add $0x2daf,%eax | |
318 1222: 90 nop | |
319 1223: 5d pop %ebp | |
320 1224: c2 04 00 ret $0x4 | |
321 | |
322 00001227 <f2>: | |
323 1227: 55 push %ebp | |
324 1228: 89 e5 mov %esp,%ebp | |
325 122a: 83 ec 04 sub $0x4,%esp | |
326 122d: e8 db ff ff ff call 120d <__x86.get_pc_thunk.ax> | |
327 1232: 05 9a 2d 00 00 add $0x2d9a,%eax | |
328 1237: 89 4d fc mov %ecx,-0x4(%ebp) | |
329 123a: 90 nop | |
330 123b: c9 leave | |
331 123c: c3 ret | |
332 | |
333 0000123d <f>: | |
334 123d: 55 push %ebp ; | |
335 123e: 89 e5 mov %esp,%ebp ; | |
336 1240: 83 ec 28 sub $0x28,%esp ; | |
337 1243: e8 c5 ff ff ff call 120d <__x86.get_pc_thunk.ax> ; | |
338 1248: 05 84 2d 00 00 add $0x2d84,%eax ; | |
339 124d: 65 a1 14 00 00 00 mov %gs:0x14,%eax ; | |
340 1253: 89 45 f4 mov %eax,-0xc(%ebp) ; | |
341 1256: 31 c0 xor %eax,%eax ; | |
342 1258: 8d 45 e8 lea -0x18(%ebp),%eax ; | |
343 125b: 89 c1 mov %eax,%ecx ; | |
344 125d: e8 60 00 00 00 call 12c2 <_ZN10NonTrivialC1Ev> ; NonTrivial::NonTrivial() / ctor | |
345 1262: c7 45 f0 01 00 00 00 movl $0x1,-0x10(%ebp) ; | |
346 1269: 83 45 f0 7b addl $0x7b,-0x10(%ebp) ; | |
347 126d: 83 ec 0c sub $0xc,%esp ; | |
348 1270: ff 75 e4 pushl -0x1c(%ebp) ; | |
349 1273: e8 9d ff ff ff call 1215 <f1> ; call f1(struct Trivial) | |
350 1278: 83 c4 0c add $0xc,%esp ; | |
351 127b: 83 6d f0 7b subl $0x7b,-0x10(%ebp) ; | |
352 127f: 8d 55 e8 lea -0x18(%ebp),%edx ; | ptr to n | |
353 1282: 8d 45 ec lea -0x14(%ebp),%eax ; | | | |
354 1285: 89 c1 mov %eax,%ecx ; | copy n | ptr to dest of copy of n | |
355 1287: e8 56 00 00 00 call 12e2 <_ZN10NonTrivialC1ERKS_> ; / NonTrivial::NonTrivial(const NonTrivial&) / copy ctor | |
356 128c: 8d 45 ec lea -0x14(%ebp),%eax ; \ | |
357 128f: 89 c1 mov %eax,%ecx ; | f2 arg 0 (ptr to copy of struct NonTrivial), via ptr as non-trivial | |
358 1291: e8 91 ff ff ff call 1227 <f2> ; call f2(struct NonTrivial) | |
359 1296: 83 6d f0 0c subl $0xc,-0x10(%ebp) ; | |
360 129a: 90 nop ; | |
361 129b: 8b 45 f4 mov -0xc(%ebp),%eax ; | |
362 129e: 65 33 05 14 00 00 00 xor %gs:0x14,%eax ; | |
363 12a5: 74 05 je 12ac <f+0x6f> ; | |
364 12a7: e8 59 00 00 00 call 1305 <__stack_chk_fail_local> ; | |
365 12ac: c9 leave ; | |
366 12ad: c3 ret ; | |
367 | |
368 ; ... snip, removed code of ctor and copy ctor ... | |
369 | |
370 | |
371 | |
282 ; vim: ft=asm | 372 ; vim: ft=asm |
283 | 373 |