From 1276fbdf4858d8a644a0dd4c70e7b28cd8990b14 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?agentzh=20=28=E7=AB=A0=E4=BA=A6=E6=98=A5=29?= Date: Mon, 8 Aug 2011 13:27:17 +0800 Subject: [PATCH] bundled gcc's unwind-generic.h for BSD because unwind.h is missing at least on FreeBSD. released ngx_openresty 1.0.4.2rc12. --- misc/unwind-generic.h | 241 ++++++++++++++++++++++++++++++++++++++++++ t/sanity.t | 63 ++++++++++- util/configure | 32 +++++- util/mirror-tarballs | 1 + util/ver | 2 +- 5 files changed, 331 insertions(+), 8 deletions(-) create mode 100644 misc/unwind-generic.h diff --git a/misc/unwind-generic.h b/misc/unwind-generic.h new file mode 100644 index 0000000..3f4c065 --- /dev/null +++ b/misc/unwind-generic.h @@ -0,0 +1,241 @@ +/* Exception handling and frame unwind runtime interface routines. + Copyright (C) 2001, 2003, 2004, 2006 Free Software Foundation, Inc. + + This file is part of GCC. + + GCC is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + GCC is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with GCC; see the file COPYING. If not, write to the Free + Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ + +/* As a special exception, if you include this header file into source + files compiled by GCC, this header file does not by itself cause + the resulting executable to be covered by the GNU General Public + License. This exception does not however invalidate any other + reasons why the executable file might be covered by the GNU General + Public License. */ + +/* This is derived from the C++ ABI for IA-64. Where we diverge + for cross-architecture compatibility are noted with "@@@". */ + +#ifndef _UNWIND_H +#define _UNWIND_H + +#ifndef HIDE_EXPORTS +#pragma GCC visibility push(default) +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Level 1: Base ABI */ + +/* @@@ The IA-64 ABI uses uint64 throughout. Most places this is + inefficient for 32-bit and smaller machines. */ +typedef unsigned _Unwind_Word __attribute__((__mode__(__word__))); +typedef signed _Unwind_Sword __attribute__((__mode__(__word__))); +#if defined(__ia64__) && defined(__hpux__) +typedef unsigned _Unwind_Ptr __attribute__((__mode__(__word__))); +#else +typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__))); +#endif +typedef unsigned _Unwind_Internal_Ptr __attribute__((__mode__(__pointer__))); + +/* @@@ The IA-64 ABI uses a 64-bit word to identify the producer and + consumer of an exception. We'll go along with this for now even on + 32-bit machines. We'll need to provide some other option for + 16-bit machines and for machines with > 8 bits per byte. */ +typedef unsigned _Unwind_Exception_Class __attribute__((__mode__(__DI__))); + +/* The unwind interface uses reason codes in several contexts to + identify the reasons for failures or other actions. */ +typedef enum +{ + _URC_NO_REASON = 0, + _URC_FOREIGN_EXCEPTION_CAUGHT = 1, + _URC_FATAL_PHASE2_ERROR = 2, + _URC_FATAL_PHASE1_ERROR = 3, + _URC_NORMAL_STOP = 4, + _URC_END_OF_STACK = 5, + _URC_HANDLER_FOUND = 6, + _URC_INSTALL_CONTEXT = 7, + _URC_CONTINUE_UNWIND = 8 +} _Unwind_Reason_Code; + + +/* The unwind interface uses a pointer to an exception header object + as its representation of an exception being thrown. In general, the + full representation of an exception object is language- and + implementation-specific, but it will be prefixed by a header + understood by the unwind interface. */ + +struct _Unwind_Exception; + +typedef void (*_Unwind_Exception_Cleanup_Fn) (_Unwind_Reason_Code, + struct _Unwind_Exception *); + +struct _Unwind_Exception +{ + _Unwind_Exception_Class exception_class; + _Unwind_Exception_Cleanup_Fn exception_cleanup; + _Unwind_Word private_1; + _Unwind_Word private_2; + + /* @@@ The IA-64 ABI says that this structure must be double-word aligned. + Taking that literally does not make much sense generically. Instead we + provide the maximum alignment required by any type for the machine. */ +} __attribute__((__aligned__)); + + +/* The ACTIONS argument to the personality routine is a bitwise OR of one + or more of the following constants. */ +typedef int _Unwind_Action; + +#define _UA_SEARCH_PHASE 1 +#define _UA_CLEANUP_PHASE 2 +#define _UA_HANDLER_FRAME 4 +#define _UA_FORCE_UNWIND 8 +#define _UA_END_OF_STACK 16 + +/* This is an opaque type used to refer to a system-specific data + structure used by the system unwinder. This context is created and + destroyed by the system, and passed to the personality routine + during unwinding. */ +struct _Unwind_Context; + +/* Raise an exception, passing along the given exception object. */ +extern _Unwind_Reason_Code _Unwind_RaiseException (struct _Unwind_Exception *); + +/* Raise an exception for forced unwinding. */ + +typedef _Unwind_Reason_Code (*_Unwind_Stop_Fn) + (int, _Unwind_Action, _Unwind_Exception_Class, + struct _Unwind_Exception *, struct _Unwind_Context *, void *); + +extern _Unwind_Reason_Code _Unwind_ForcedUnwind (struct _Unwind_Exception *, + _Unwind_Stop_Fn, + void *); + +/* Helper to invoke the exception_cleanup routine. */ +extern void _Unwind_DeleteException (struct _Unwind_Exception *); + +/* Resume propagation of an existing exception. This is used after + e.g. executing cleanup code, and not to implement rethrowing. */ +extern void _Unwind_Resume (struct _Unwind_Exception *); + +/* @@@ Resume propagation of an FORCE_UNWIND exception, or to rethrow + a normal exception that was handled. */ +extern _Unwind_Reason_Code _Unwind_Resume_or_Rethrow (struct _Unwind_Exception *); + +/* @@@ Use unwind data to perform a stack backtrace. The trace callback + is called for every stack frame in the call chain, but no cleanup + actions are performed. */ +typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn) + (struct _Unwind_Context *, void *); + +extern _Unwind_Reason_Code _Unwind_Backtrace (_Unwind_Trace_Fn, void *); + +/* These functions are used for communicating information about the unwind + context (i.e. the unwind descriptors and the user register state) between + the unwind library and the personality routine and landing pad. Only + selected registers maybe manipulated. */ + +extern _Unwind_Word _Unwind_GetGR (struct _Unwind_Context *, int); +extern void _Unwind_SetGR (struct _Unwind_Context *, int, _Unwind_Word); + +extern _Unwind_Ptr _Unwind_GetIP (struct _Unwind_Context *); +extern _Unwind_Ptr _Unwind_GetIPInfo (struct _Unwind_Context *, int *); +extern void _Unwind_SetIP (struct _Unwind_Context *, _Unwind_Ptr); + +/* @@@ Retrieve the CFA of the given context. */ +extern _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *); + +extern void *_Unwind_GetLanguageSpecificData (struct _Unwind_Context *); + +extern _Unwind_Ptr _Unwind_GetRegionStart (struct _Unwind_Context *); + + +/* The personality routine is the function in the C++ (or other language) + runtime library which serves as an interface between the system unwind + library and language-specific exception handling semantics. It is + specific to the code fragment described by an unwind info block, and + it is always referenced via the pointer in the unwind info block, and + hence it has no ABI-specified name. + + Note that this implies that two different C++ implementations can + use different names, and have different contents in the language + specific data area. Moreover, that the language specific data + area contains no version info because name of the function invoked + provides more effective versioning by detecting at link time the + lack of code to handle the different data format. */ + +typedef _Unwind_Reason_Code (*_Unwind_Personality_Fn) + (int, _Unwind_Action, _Unwind_Exception_Class, + struct _Unwind_Exception *, struct _Unwind_Context *); + +/* @@@ The following alternate entry points are for setjmp/longjmp + based unwinding. */ + +struct SjLj_Function_Context; +extern void _Unwind_SjLj_Register (struct SjLj_Function_Context *); +extern void _Unwind_SjLj_Unregister (struct SjLj_Function_Context *); + +extern _Unwind_Reason_Code _Unwind_SjLj_RaiseException + (struct _Unwind_Exception *); +extern _Unwind_Reason_Code _Unwind_SjLj_ForcedUnwind + (struct _Unwind_Exception *, _Unwind_Stop_Fn, void *); +extern void _Unwind_SjLj_Resume (struct _Unwind_Exception *); +extern _Unwind_Reason_Code _Unwind_SjLj_Resume_or_Rethrow (struct _Unwind_Exception *); + +/* @@@ The following provide access to the base addresses for text + and data-relative addressing in the LDSA. In order to stay link + compatible with the standard ABI for IA-64, we inline these. */ + +#ifdef __ia64__ +#include + +static inline _Unwind_Ptr +_Unwind_GetDataRelBase (struct _Unwind_Context *_C) +{ + /* The GP is stored in R1. */ + return _Unwind_GetGR (_C, 1); +} + +static inline _Unwind_Ptr +_Unwind_GetTextRelBase (struct _Unwind_Context *_C __attribute__ ((__unused__))) +{ + abort (); + return 0; +} + +/* @@@ Retrieve the Backing Store Pointer of the given context. */ +extern _Unwind_Word _Unwind_GetBSP (struct _Unwind_Context *); +#else +extern _Unwind_Ptr _Unwind_GetDataRelBase (struct _Unwind_Context *); +extern _Unwind_Ptr _Unwind_GetTextRelBase (struct _Unwind_Context *); +#endif + +/* @@@ Given an address, return the entry point of the function that + contains it. */ +extern void * _Unwind_FindEnclosingFunction (void *pc); + +#ifdef __cplusplus +} +#endif + +#ifndef HIDE_EXPORTS +#pragma GCC visibility pop +#endif + +#endif /* unwind.h */ diff --git a/t/sanity.t b/t/sanity.t index dc9aa40..69b006c 100644 --- a/t/sanity.t +++ b/t/sanity.t @@ -211,6 +211,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -260,6 +263,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -318,6 +324,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -367,6 +376,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -415,6 +427,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib -llua' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -462,6 +477,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -502,6 +520,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -547,6 +568,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -764,6 +788,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -812,6 +839,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -860,6 +890,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -921,6 +954,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/opt/drizzle/lib' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- err --- makefile .PHONY: all install clean @@ -969,6 +1005,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-cc=gcc-4.2 --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -1019,6 +1058,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -1069,6 +1111,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/local/openresty/luajit/lib' \ --with-cc=cl --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -1130,6 +1175,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/opt/postgres/lib' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- err --- makefile .PHONY: all install clean @@ -1179,6 +1227,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- makefile .PHONY: all install clean @@ -1248,6 +1299,9 @@ cd nginx-1.0.4 --with-ld-opt='-Wl,-rpath,/usr/lib64' \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + gmake + gmake install --- err --- makefile .PHONY: all install clean @@ -1283,9 +1337,9 @@ cp -rp bundle/ build/ cd build cd lua-5.1.4 make linux -make install INSTALL_TOP=/home/agentz/git/ngx_openresty/ngx_openresty-1.0.4.2rc11/build/lua-root/usr/local/openresty/lua -export LUA_LIB='/home/agentz/git/ngx_openresty/ngx_openresty-1.0.4.2rc11/build/lua-root/usr/local/openresty/lua/lib' -export LUA_INC='/home/agentz/git/ngx_openresty/ngx_openresty-1.0.4.2rc11/build/lua-root/usr/local/openresty/lua/include' +make install INSTALL_TOP=$OPENRESTY_BUILD_DIR/lua-root/usr/local/openresty/lua +export LUA_LIB='$OPENRESTY_BUILD_DIR/lua-root/usr/local/openresty/lua/lib' +export LUA_INC='$OPENRESTY_BUILD_DIR/lua-root/usr/local/openresty/lua/include' cd .. cd nginx-1.0.4 ./configure --prefix=/usr/local/openresty/nginx \ @@ -1306,6 +1360,9 @@ cd nginx-1.0.4 --add-module=../rds-json-nginx-module-0.12rc1 \ --with-http_ssl_module cd ../.. +Type the following commands to build and install: + make + make install --- err --- makefile .PHONY: all install clean diff --git a/util/configure b/util/configure index 219143b..5b91e03 100755 --- a/util/configure +++ b/util/configure @@ -201,6 +201,8 @@ print "platform: $platform ($OS)\n"; my $ngx_prefix = "$prefix/nginx"; +my $postamble = ''; + my $resty_opts = build_resty_opts(\%resty_opts); if (@ngx_rpaths) { @@ -231,6 +233,10 @@ cd '../..'; # to the root gen_makefile(); +if ($postamble) { + print $postamble; +} + sub env ($$) { my ($name, $val) = @_; print "export $name='$val'\n"; @@ -281,14 +287,28 @@ sub build_resty_opts { if (can_run("gmake")) { $make = 'gmake'; - } elsif (can_run("make")) { - $make = "make"; - } else { - die "No gmake nor make found in PATH.\n"; + # no gmake found + + if ($platform =~ /bsd/i && $opts->{luajit}) { + die "you need to install gmake to build LuaJIT.\n"; + } + + if (can_run("make")) { + $make = "make"; + + } else { + die "No gmake nor make found in PATH.\n"; + } } } + $postamble .= <<"_END_"; +Type the following commands to build and install: + $make + $make install +_END_ + if ($opts->{no_ndk}) { for my $name (qw(lua set_misc iconv lz_session form_input array_var)) { if (! $opts->{"no_http_$name"}) { @@ -422,6 +442,10 @@ sub build_resty_opts { $extra_opts = ' CCDEBUG=-g Q='; } + if ($platform =~ /bsd/i) { + $extra_opts .= ' CFLAGS=-I..'; + } + if (defined $cc) { $extra_opts .= " CC=$cc"; } diff --git a/util/mirror-tarballs b/util/mirror-tarballs index 08f295f..ab2bff6 100755 --- a/util/mirror-tarballs +++ b/util/mirror-tarballs @@ -198,6 +198,7 @@ cd LuaJIT-$ver || exit 1; $root/util/get-tarball http://luajit.org/download/beta8_hotfix1.patch -O beta8_hotfix1.patch patch -p1 < beta8_hotfix1.patch || exit 1 rm beta8_hotfix1.patch || exit 1 +cp $root/misc/unwind-generic.h ./unwind.h || exit 1 cd .. ################################# diff --git a/util/ver b/util/ver index eec9c89..da9eee8 100755 --- a/util/ver +++ b/util/ver @@ -1,7 +1,7 @@ #!/bin/bash main_ver=1.0.4 -minor_ver=2rc11 +minor_ver=2rc12 version=$main_ver.$minor_ver echo $version