Commit cd51fcd3 authored by ager@chromium.org's avatar ager@chromium.org

Land patch to add Solaris platform support.

Patch by Erich Ocean and Ryan Dahl.

Review URL: http://codereview.chromium.org/545125

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@3688 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent f88e7e82
...@@ -10,6 +10,7 @@ Alexandre Vassalotti <avassalotti@gmail.com> ...@@ -10,6 +10,7 @@ Alexandre Vassalotti <avassalotti@gmail.com>
Craig Schlenter <craig.schlenter@gmail.com> Craig Schlenter <craig.schlenter@gmail.com>
Daniel Andersson <kodandersson@gmail.com> Daniel Andersson <kodandersson@gmail.com>
Daniel James <dnljms@gmail.com> Daniel James <dnljms@gmail.com>
Erich Ocean <erich.ocean@me.com>
Jan de Mooij <jandemooij@gmail.com> Jan de Mooij <jandemooij@gmail.com>
Jay Freeman <saurik@saurik.com> Jay Freeman <saurik@saurik.com>
Joel Stanley <joel.stan@gmail.com> Joel Stanley <joel.stan@gmail.com>
......
...@@ -35,7 +35,6 @@ root_dir = dirname(File('SConstruct').rfile().abspath) ...@@ -35,7 +35,6 @@ root_dir = dirname(File('SConstruct').rfile().abspath)
sys.path.append(join(root_dir, 'tools')) sys.path.append(join(root_dir, 'tools'))
import js2c, utils import js2c, utils
# ANDROID_TOP is the top of the Android checkout, fetched from the environment # ANDROID_TOP is the top of the Android checkout, fetched from the environment
# variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB # variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB
# environment variables to the cross-compiling tools. # environment variables to the cross-compiling tools.
...@@ -157,6 +156,11 @@ LIBRARY_FLAGS = { ...@@ -157,6 +156,11 @@ LIBRARY_FLAGS = {
'LIBPATH' : ['/usr/local/lib'], 'LIBPATH' : ['/usr/local/lib'],
'CCFLAGS': ['-ansi'], 'CCFLAGS': ['-ansi'],
}, },
'os:solaris': {
'CPPPATH' : ['/usr/local/include'],
'LIBPATH' : ['/usr/local/lib'],
'CCFLAGS': ['-ansi'],
},
'os:win32': { 'os:win32': {
'CCFLAGS': ['-DWIN32'], 'CCFLAGS': ['-DWIN32'],
'CXXFLAGS': ['-DWIN32'], 'CXXFLAGS': ['-DWIN32'],
...@@ -313,6 +317,10 @@ MKSNAPSHOT_EXTRA_FLAGS = { ...@@ -313,6 +317,10 @@ MKSNAPSHOT_EXTRA_FLAGS = {
'os:freebsd': { 'os:freebsd': {
'LIBS': ['execinfo', 'pthread'] 'LIBS': ['execinfo', 'pthread']
}, },
'os:solaris': {
'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
'LINKFLAGS': ['-mt']
},
'os:openbsd': { 'os:openbsd': {
'LIBS': ['execinfo', 'pthread'] 'LIBS': ['execinfo', 'pthread']
}, },
...@@ -362,6 +370,10 @@ CCTEST_EXTRA_FLAGS = { ...@@ -362,6 +370,10 @@ CCTEST_EXTRA_FLAGS = {
'os:freebsd': { 'os:freebsd': {
'LIBS': ['execinfo', 'pthread'] 'LIBS': ['execinfo', 'pthread']
}, },
'os:solaris': {
'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
'LINKFLAGS': ['-mt']
},
'os:openbsd': { 'os:openbsd': {
'LIBS': ['execinfo', 'pthread'] 'LIBS': ['execinfo', 'pthread']
}, },
...@@ -420,6 +432,11 @@ SAMPLE_FLAGS = { ...@@ -420,6 +432,11 @@ SAMPLE_FLAGS = {
'LIBPATH' : ['/usr/local/lib'], 'LIBPATH' : ['/usr/local/lib'],
'LIBS': ['execinfo', 'pthread'] 'LIBS': ['execinfo', 'pthread']
}, },
'os:solaris': {
'LIBPATH' : ['/usr/local/lib'],
'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
'LINKFLAGS': ['-mt']
},
'os:openbsd': { 'os:openbsd': {
'LIBPATH' : ['/usr/local/lib'], 'LIBPATH' : ['/usr/local/lib'],
'LIBS': ['execinfo', 'pthread'] 'LIBS': ['execinfo', 'pthread']
...@@ -529,6 +546,10 @@ D8_FLAGS = { ...@@ -529,6 +546,10 @@ D8_FLAGS = {
'os:freebsd': { 'os:freebsd': {
'LIBS': ['pthread'], 'LIBS': ['pthread'],
}, },
'os:solaris': {
'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
'LINKFLAGS': ['-mt']
},
'os:openbsd': { 'os:openbsd': {
'LIBS': ['pthread'], 'LIBS': ['pthread'],
}, },
...@@ -582,7 +603,7 @@ SIMPLE_OPTIONS = { ...@@ -582,7 +603,7 @@ SIMPLE_OPTIONS = {
'help': 'the toolchain to use (' + TOOLCHAIN_GUESS + ')' 'help': 'the toolchain to use (' + TOOLCHAIN_GUESS + ')'
}, },
'os': { 'os': {
'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd'], 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris'],
'default': OS_GUESS, 'default': OS_GUESS,
'help': 'the os to build for (' + OS_GUESS + ')' 'help': 'the os to build for (' + OS_GUESS + ')'
}, },
...@@ -936,6 +957,7 @@ def BuildSpecific(env, mode, env_overrides): ...@@ -936,6 +957,7 @@ def BuildSpecific(env, mode, env_overrides):
# Link the object files into a library. # Link the object files into a library.
env.Replace(**context.flags['v8']) env.Replace(**context.flags['v8'])
context.ApplyEnvOverrides(env) context.ApplyEnvOverrides(env)
if context.options['library'] == 'static': if context.options['library'] == 'static':
library = env.StaticLibrary(library_name, object_files) library = env.StaticLibrary(library_name, object_files)
......
...@@ -168,6 +168,7 @@ SOURCES = { ...@@ -168,6 +168,7 @@ SOURCES = {
'os:linux': ['platform-linux.cc', 'platform-posix.cc'], 'os:linux': ['platform-linux.cc', 'platform-posix.cc'],
'os:android': ['platform-linux.cc', 'platform-posix.cc'], 'os:android': ['platform-linux.cc', 'platform-posix.cc'],
'os:macos': ['platform-macos.cc', 'platform-posix.cc'], 'os:macos': ['platform-macos.cc', 'platform-posix.cc'],
'os:solaris': ['platform-solaris.cc', 'platform-posix.cc'],
'os:nullos': ['platform-nullos.cc'], 'os:nullos': ['platform-nullos.cc'],
'os:win32': ['platform-win32.cc'], 'os:win32': ['platform-win32.cc'],
'mode:release': [], 'mode:release': [],
...@@ -196,6 +197,9 @@ D8_FILES = { ...@@ -196,6 +197,9 @@ D8_FILES = {
'os:openbsd': [ 'os:openbsd': [
'd8-posix.cc' 'd8-posix.cc'
], ],
'os:solaris': [
'd8-posix.cc'
],
'os:win32': [ 'os:win32': [
'd8-windows.cc' 'd8-windows.cc'
], ],
......
...@@ -38,7 +38,8 @@ ...@@ -38,7 +38,8 @@
*/ */
#if !(defined(__APPLE__) && defined(__MACH__)) && \ #if !(defined(__APPLE__) && defined(__MACH__)) && \
!defined(WIN32) && !defined(__FreeBSD__) && !defined(__OpenBSD__) !defined(WIN32) && !defined(__FreeBSD__) && !defined(__OpenBSD__) && \
!defined(__sun)
#include <endian.h> #include <endian.h>
#endif #endif
#include <math.h> #include <math.h>
...@@ -47,7 +48,7 @@ ...@@ -47,7 +48,7 @@
/* The floating point word order on ARM is big endian when floating point /* The floating point word order on ARM is big endian when floating point
* emulation is used, even if the byte order is little endian */ * emulation is used, even if the byte order is little endian */
#if !(defined(__APPLE__) && defined(__MACH__)) && !defined(WIN32) && \ #if !(defined(__APPLE__) && defined(__MACH__)) && !defined(WIN32) && \
!defined(__FreeBSD__) && !defined(__OpenBSD__) && \ !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__sun) && \
__FLOAT_WORD_ORDER == __BIG_ENDIAN __FLOAT_WORD_ORDER == __BIG_ENDIAN
#define IEEE_MC68k #define IEEE_MC68k
#else #else
...@@ -56,7 +57,7 @@ ...@@ -56,7 +57,7 @@
#define __MATH_H__ #define __MATH_H__
#if defined(__APPLE__) && defined(__MACH__) || defined(__FreeBSD__) || \ #if defined(__APPLE__) && defined(__MACH__) || defined(__FreeBSD__) || \
defined(__OpenBSD__) defined(__OpenBSD__) || defined(__sun)
/* stdlib.h on FreeBSD and Apple's 10.5 and later SDKs will mangle the /* stdlib.h on FreeBSD and Apple's 10.5 and later SDKs will mangle the
* name of strtod. If it's included after strtod is redefined as * name of strtod. If it's included after strtod is redefined as
* gay_strtod, it will mangle the name of gay_strtod, which is * gay_strtod, it will mangle the name of gay_strtod, which is
......
...@@ -95,6 +95,24 @@ int OS::ActivationFrameAlignment() { ...@@ -95,6 +95,24 @@ int OS::ActivationFrameAlignment() {
} }
const char* OS::LocalTimezone(double time) {
if (isnan(time)) return "";
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
if (NULL == t) return "";
return t->tm_zone;
}
double OS::LocalTimeOffset() {
time_t tv = time(NULL);
struct tm* t = localtime(&tv);
// tm_gmtoff includes any daylight savings offset, so subtract it.
return static_cast<double>(t->tm_gmtoff * msPerSecond -
(t->tm_isdst > 0 ? 3600 * msPerSecond : 0));
}
// We keep the lowest and highest addresses mapped as a quick way of // We keep the lowest and highest addresses mapped as a quick way of
// determining that pointers are outside the heap (used mostly in assertions // determining that pointers are outside the heap (used mostly in assertions
// and verification). The estimate is conservative, ie, not all addresses in // and verification). The estimate is conservative, ie, not all addresses in
......
...@@ -159,6 +159,24 @@ int OS::ActivationFrameAlignment() { ...@@ -159,6 +159,24 @@ int OS::ActivationFrameAlignment() {
} }
const char* OS::LocalTimezone(double time) {
if (isnan(time)) return "";
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
if (NULL == t) return "";
return t->tm_zone;
}
double OS::LocalTimeOffset() {
time_t tv = time(NULL);
struct tm* t = localtime(&tv);
// tm_gmtoff includes any daylight savings offset, so subtract it.
return static_cast<double>(t->tm_gmtoff * msPerSecond -
(t->tm_isdst > 0 ? 3600 * msPerSecond : 0));
}
// We keep the lowest and highest addresses mapped as a quick way of // We keep the lowest and highest addresses mapped as a quick way of
// determining that pointers are outside the heap (used mostly in assertions // determining that pointers are outside the heap (used mostly in assertions
// and verification). The estimate is conservative, ie, not all addresses in // and verification). The estimate is conservative, ie, not all addresses in
......
...@@ -259,6 +259,24 @@ int OS::ActivationFrameAlignment() { ...@@ -259,6 +259,24 @@ int OS::ActivationFrameAlignment() {
} }
const char* OS::LocalTimezone(double time) {
if (isnan(time)) return "";
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
if (NULL == t) return "";
return t->tm_zone;
}
double OS::LocalTimeOffset() {
time_t tv = time(NULL);
struct tm* t = localtime(&tv);
// tm_gmtoff includes any daylight savings offset, so subtract it.
return static_cast<double>(t->tm_gmtoff * msPerSecond -
(t->tm_isdst > 0 ? 3600 * msPerSecond : 0));
}
int OS::StackWalk(Vector<StackFrame> frames) { int OS::StackWalk(Vector<StackFrame> frames) {
// If weak link to execinfo lib has failed, ie because we are on 10.4, abort. // If weak link to execinfo lib has failed, ie because we are on 10.4, abort.
if (backtrace == NULL) if (backtrace == NULL)
......
...@@ -94,6 +94,24 @@ int OS::ActivationFrameAlignment() { ...@@ -94,6 +94,24 @@ int OS::ActivationFrameAlignment() {
} }
const char* OS::LocalTimezone(double time) {
if (isnan(time)) return "";
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
if (NULL == t) return "";
return t->tm_zone;
}
double OS::LocalTimeOffset() {
time_t tv = time(NULL);
struct tm* t = localtime(&tv);
// tm_gmtoff includes any daylight savings offset, so subtract it.
return static_cast<double>(t->tm_gmtoff * msPerSecond -
(t->tm_isdst > 0 ? 3600 * msPerSecond : 0));
}
// We keep the lowest and highest addresses mapped as a quick way of // We keep the lowest and highest addresses mapped as a quick way of
// determining that pointers are outside the heap (used mostly in assertions // determining that pointers are outside the heap (used mostly in assertions
// and verification). The estimate is conservative, ie, not all addresses in // and verification). The estimate is conservative, ie, not all addresses in
......
...@@ -99,15 +99,6 @@ int64_t OS::Ticks() { ...@@ -99,15 +99,6 @@ int64_t OS::Ticks() {
} }
const char* OS::LocalTimezone(double time) {
if (isnan(time)) return "";
time_t tv = static_cast<time_t>(floor(time/msPerSecond));
struct tm* t = localtime(&tv);
if (NULL == t) return "";
return t->tm_zone;
}
double OS::DaylightSavingsOffset(double time) { double OS::DaylightSavingsOffset(double time) {
if (isnan(time)) return nan_value(); if (isnan(time)) return nan_value();
time_t tv = static_cast<time_t>(floor(time/msPerSecond)); time_t tv = static_cast<time_t>(floor(time/msPerSecond));
...@@ -117,15 +108,6 @@ double OS::DaylightSavingsOffset(double time) { ...@@ -117,15 +108,6 @@ double OS::DaylightSavingsOffset(double time) {
} }
double OS::LocalTimeOffset() {
time_t tv = time(NULL);
struct tm* t = localtime(&tv);
// tm_gmtoff includes any daylight savings offset, so subtract it.
return static_cast<double>(t->tm_gmtoff * msPerSecond -
(t->tm_isdst > 0 ? 3600 * msPerSecond : 0));
}
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// POSIX stdio support. // POSIX stdio support.
// //
......
...@@ -44,6 +44,12 @@ ...@@ -44,6 +44,12 @@
#ifndef V8_PLATFORM_H_ #ifndef V8_PLATFORM_H_
#define V8_PLATFORM_H_ #define V8_PLATFORM_H_
#ifdef __sun
// On Solaris, to get isinf, INFINITY, fpclassify and other macros one needs
// to define this symbol
#define __C99FEATURES__ 1
#endif
#define V8_INFINITY INFINITY #define V8_INFINITY INFINITY
// Windows specific stuff. // Windows specific stuff.
......
...@@ -26,6 +26,7 @@ ...@@ -26,6 +26,7 @@
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include <stdlib.h> #include <stdlib.h>
#include <wchar.h> // wint_t
#include "v8.h" #include "v8.h"
...@@ -73,7 +74,7 @@ v8::Handle<v8::Value> PrintExtension::Print(const v8::Arguments& args) { ...@@ -73,7 +74,7 @@ v8::Handle<v8::Value> PrintExtension::Print(const v8::Arguments& args) {
uint16_t* string = NewArray<uint16_t>(length + 1); uint16_t* string = NewArray<uint16_t>(length + 1);
string_obj->Write(string); string_obj->Write(string);
for (int j = 0; j < length; j++) for (int j = 0; j < length; j++)
printf("%lc", string[j]); printf("%lc", static_cast<wint_t>(string[j]));
DeleteArray(string); DeleteArray(string);
} }
printf("\n"); printf("\n");
......
...@@ -57,6 +57,8 @@ def GuessOS(): ...@@ -57,6 +57,8 @@ def GuessOS():
return 'freebsd' return 'freebsd'
elif id == 'OpenBSD': elif id == 'OpenBSD':
return 'openbsd' return 'openbsd'
elif id == 'SunOS':
return 'solaris'
else: else:
return None return None
...@@ -67,6 +69,8 @@ def GuessArchitecture(): ...@@ -67,6 +69,8 @@ def GuessArchitecture():
return 'arm' return 'arm'
elif (not id) or (not re.match('(x|i[3-6])86', id) is None): elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
return 'ia32' return 'ia32'
elif id == 'i86pc':
return 'ia32'
else: else:
return None return None
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment