code_junkie

How do exceptions work (behind the scenes) in c++

Nov 12th, 2011
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.61 KB | None | 0 0
  1. class MyException
  2. {
  3. public:
  4. MyException() { }
  5. ~MyException() { }
  6. };
  7.  
  8. void my_throwing_function(bool throwit)
  9. {
  10. if (throwit)
  11. throw MyException();
  12. }
  13.  
  14. void another_function();
  15. void log(unsigned count);
  16.  
  17. void my_catching_function()
  18. {
  19. log(0);
  20. try
  21. {
  22. log(1);
  23. another_function();
  24. log(2);
  25. }
  26. catch (const MyException& e)
  27. {
  28. log(3);
  29. }
  30. log(4);
  31. }
  32.  
  33. .file "foo.cpp"
  34. .section .text._ZN11MyExceptionD1Ev,"axG",@progbits,_ZN11MyExceptionD1Ev,comdat
  35. .align 2
  36. .p2align 4,,15
  37. .weak _ZN11MyExceptionD1Ev
  38. .type _ZN11MyExceptionD1Ev, @function
  39. _ZN11MyExceptionD1Ev:
  40. .LFB7:
  41. pushl %ebp
  42. .LCFI0:
  43. movl %esp, %ebp
  44. .LCFI1:
  45. popl %ebp
  46. ret
  47. .LFE7:
  48. .size _ZN11MyExceptionD1Ev, .-_ZN11MyExceptionD1Ev
  49.  
  50. .globl __gxx_personality_v0
  51. .globl _Unwind_Resume
  52. .text
  53. .align 2
  54. .p2align 4,,15
  55. .globl _Z20my_catching_functionv
  56. .type _Z20my_catching_functionv, @function
  57. _Z20my_catching_functionv:
  58. .LFB9:
  59. pushl %ebp
  60. .LCFI2:
  61. movl %esp, %ebp
  62. .LCFI3:
  63. pushl %ebx
  64. .LCFI4:
  65. subl $20, %esp
  66. .LCFI5:
  67. movl $0, (%esp)
  68. .LEHB0:
  69. call _Z3logj
  70. .LEHE0:
  71. movl $1, (%esp)
  72. .LEHB1:
  73. call _Z3logj
  74. call _Z16another_functionv
  75. movl $2, (%esp)
  76. call _Z3logj
  77. .LEHE1:
  78. .L5:
  79. movl $4, (%esp)
  80. .LEHB2:
  81. call _Z3logj
  82. addl $20, %esp
  83. popl %ebx
  84. popl %ebp
  85. ret
  86. .L12:
  87. subl $1, %edx
  88. movl %eax, %ebx
  89. je .L16
  90. .L14:
  91. movl %ebx, (%esp)
  92. call _Unwind_Resume
  93. .LEHE2:
  94. .L16:
  95. .L6:
  96. movl %eax, (%esp)
  97. call __cxa_begin_catch
  98. movl $3, (%esp)
  99. .LEHB3:
  100. call _Z3logj
  101. .LEHE3:
  102. call __cxa_end_catch
  103. .p2align 4,,3
  104. jmp .L5
  105. .L11:
  106. .L8:
  107. movl %eax, %ebx
  108. .p2align 4,,6
  109. call __cxa_end_catch
  110. .p2align 4,,6
  111. jmp .L14
  112. .LFE9:
  113. .size _Z20my_catching_functionv, .-_Z20my_catching_functionv
  114. .section .gcc_except_table,"a",@progbits
  115. .align 4
  116. .LLSDA9:
  117. .byte 0xff
  118. .byte 0x0
  119. .uleb128 .LLSDATT9-.LLSDATTD9
  120. .LLSDATTD9:
  121. .byte 0x1
  122. .uleb128 .LLSDACSE9-.LLSDACSB9
  123. .LLSDACSB9:
  124. .uleb128 .LEHB0-.LFB9
  125. .uleb128 .LEHE0-.LEHB0
  126. .uleb128 0x0
  127. .uleb128 0x0
  128. .uleb128 .LEHB1-.LFB9
  129. .uleb128 .LEHE1-.LEHB1
  130. .uleb128 .L12-.LFB9
  131. .uleb128 0x1
  132. .uleb128 .LEHB2-.LFB9
  133. .uleb128 .LEHE2-.LEHB2
  134. .uleb128 0x0
  135. .uleb128 0x0
  136. .uleb128 .LEHB3-.LFB9
  137. .uleb128 .LEHE3-.LEHB3
  138. .uleb128 .L11-.LFB9
  139. .uleb128 0x0
  140. .LLSDACSE9:
  141. .byte 0x1
  142. .byte 0x0
  143. .align 4
  144. .long _ZTI11MyException
  145. .LLSDATT9:
  146.  
  147. .text
  148. .align 2
  149. .p2align 4,,15
  150. .globl _Z20my_throwing_functionb
  151. .type _Z20my_throwing_functionb, @function
  152. _Z20my_throwing_functionb:
  153. .LFB8:
  154. pushl %ebp
  155. .LCFI6:
  156. movl %esp, %ebp
  157. .LCFI7:
  158. subl $24, %esp
  159. .LCFI8:
  160. cmpb $0, 8(%ebp)
  161. jne .L21
  162. leave
  163. ret
  164. .L21:
  165. movl $1, (%esp)
  166. call __cxa_allocate_exception
  167. movl $_ZN11MyExceptionD1Ev, 8(%esp)
  168. movl $_ZTI11MyException, 4(%esp)
  169. movl %eax, (%esp)
  170. call __cxa_throw
  171. .LFE8:
  172. .size _Z20my_throwing_functionb, .-_Z20my_throwing_functionb
  173.  
  174. .weak _ZTI11MyException
  175. .section .rodata._ZTI11MyException,"aG",@progbits,_ZTI11MyException,comdat
  176. .align 4
  177. .type _ZTI11MyException, @object
  178. .size _ZTI11MyException, 8
  179. _ZTI11MyException:
  180. .long _ZTVN10__cxxabiv117__class_type_infoE+8
  181. .long _ZTS11MyException
  182. .weak _ZTS11MyException
  183. .section .rodata._ZTS11MyException,"aG",@progbits,_ZTS11MyException,comdat
  184. .type _ZTS11MyException, @object
  185. .size _ZTS11MyException, 14
  186. _ZTS11MyException:
  187. .string "11MyException"
  188.  
  189. .section .eh_frame,"a",@progbits
  190. .Lframe1:
  191. .long .LECIE1-.LSCIE1
  192. .LSCIE1:
  193. .long 0x0
  194. .byte 0x1
  195. .string "zPL"
  196. .uleb128 0x1
  197. .sleb128 -4
  198. .byte 0x8
  199. .uleb128 0x6
  200. .byte 0x0
  201. .long __gxx_personality_v0
  202. .byte 0x0
  203. .byte 0xc
  204. .uleb128 0x4
  205. .uleb128 0x4
  206. .byte 0x88
  207. .uleb128 0x1
  208. .align 4
  209. .LECIE1:
  210. .LSFDE3:
  211. .long .LEFDE3-.LASFDE3
  212. .LASFDE3:
  213. .long .LASFDE3-.Lframe1
  214. .long .LFB9
  215. .long .LFE9-.LFB9
  216. .uleb128 0x4
  217. .long .LLSDA9
  218. .byte 0x4
  219. .long .LCFI2-.LFB9
  220. .byte 0xe
  221. .uleb128 0x8
  222. .byte 0x85
  223. .uleb128 0x2
  224. .byte 0x4
  225. .long .LCFI3-.LCFI2
  226. .byte 0xd
  227. .uleb128 0x5
  228. .byte 0x4
  229. .long .LCFI5-.LCFI3
  230. .byte 0x83
  231. .uleb128 0x3
  232. .align 4
  233. .LEFDE3:
  234. .LSFDE5:
  235. .long .LEFDE5-.LASFDE5
  236. .LASFDE5:
  237. .long .LASFDE5-.Lframe1
  238. .long .LFB8
  239. .long .LFE8-.LFB8
  240. .uleb128 0x4
  241. .long 0x0
  242. .byte 0x4
  243. .long .LCFI6-.LFB8
  244. .byte 0xe
  245. .uleb128 0x8
  246. .byte 0x85
  247. .uleb128 0x2
  248. .byte 0x4
  249. .long .LCFI7-.LCFI6
  250. .byte 0xd
  251. .uleb128 0x5
  252. .align 4
  253. .LEFDE5:
  254. .ident "GCC: (GNU) 4.1.2 (Ubuntu 4.1.2-0ubuntu4)"
  255. .section .note.GNU-stack,"",@progbits
Add Comment
Please, Sign In to add comment