1c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma/* libunwind - a platform-independent unwind library
2c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma   Copyright (C) 2010 stefan.demharter@gmx.net
3c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma   Copyright (C) 2010 arun.sharma@google.com
4c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
5c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaPermission is hereby granted, free of charge, to any person obtaining
6c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmaa copy of this software and associated documentation files (the
7c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma"Software"), to deal in the Software without restriction, including
8c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmawithout limitation the rights to use, copy, modify, merge, publish,
9c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmadistribute, sublicense, and/or sell copies of the Software, and to
10c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmapermit persons to whom the Software is furnished to do so, subject to
11c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmathe following conditions:
12c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
13c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaThe above copyright notice and this permission notice shall be
14c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmaincluded in all copies or substantial portions of the Software.
15c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
16c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22c2d78041cc41e8455bd97584d5a5bb3638554632Arun SharmaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
23c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
24c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma#include <unistd.h>
25c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma#include <stdio.h>
26c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma#include <stdlib.h>
27c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma#include <libunwind.h>
28d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantala#include "compiler.h"
29c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
30c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma#define panic(args...)				\
31c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma	{ fprintf (stderr, args); exit (-1); }
32c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
33d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantalastatic int verbose;
34d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantala
35c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmastruct Test
36c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma{
37c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  public: // --- ctor/dtor ---
38c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    Test() { ++counter_; }
39c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    ~Test() { -- counter_; }
40c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    Test(const Test&) { ++counter_; }
41c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
42c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  public: // --- static members ---
43c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    static int counter_;
44c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma};
45c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
46c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmaint Test::counter_ = 0;
47c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
48c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma// Called by foo
49c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharmaextern "C" void bar()
50c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma{
51c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  Test t;
52c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  try {
53c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    Test t;
54c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    throw 5;
55c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  } catch (...) {
56c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    Test t;
57d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantala    if (verbose)
58d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantala      printf("Throwing an int\n");
59c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    throw 6;
60c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  }
61c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma}
62c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma
63d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantalaint main(int argc, char **argv UNUSED)
64c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma{
65d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantala  if (argc > 1)
66d3fd3dc3ca842a7ec2f796fc84117a71738209b5Tommi Rantala    verbose = 1;
67c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  try {
68c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    Test t;
69c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    bar();
70c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  } catch (int) {
71c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    // Dtor of all Test-object has to be called.
72c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    if (Test::counter_ != 0)
73c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma      panic("Counter non-zero\n");
74c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    return Test::counter_;
75c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  } catch (...) {
76c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    // An int was thrown - we should not get here.
77c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma    panic("Int was thrown why are we here?\n");
78c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  }
79c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma  exit(0);
80c2d78041cc41e8455bd97584d5a5bb3638554632Arun Sharma}
81