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