| OLD | NEW |
| 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
| 2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
| 3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
| 4 | 4 |
| 5 #include "vm/globals.h" | 5 #include "vm/globals.h" |
| 6 #if defined(TARGET_OS_ANDROID) | 6 #if defined(TARGET_OS_ANDROID) |
| 7 | 7 |
| 8 #include "vm/os.h" | 8 #include "vm/os.h" |
| 9 | 9 |
| 10 #include <android/log.h> // NOLINT | 10 #include <android/log.h> // NOLINT |
| 11 #include <endian.h> // NOLINT | 11 #include <endian.h> // NOLINT |
| 12 #include <errno.h> // NOLINT | 12 #include <errno.h> // NOLINT |
| 13 #include <limits.h> // NOLINT | 13 #include <limits.h> // NOLINT |
| 14 #include <malloc.h> // NOLINT | 14 #include <malloc.h> // NOLINT |
| 15 #include <time.h> // NOLINT | 15 #include <time.h> // NOLINT |
| 16 #include <sys/resource.h> // NOLINT | 16 #include <sys/resource.h> // NOLINT |
| 17 #include <sys/time.h> // NOLINT | 17 #include <sys/time.h> // NOLINT |
| 18 #include <sys/types.h> // NOLINT | 18 #include <sys/types.h> // NOLINT |
| 19 #include <unistd.h> // NOLINT | 19 #include <unistd.h> // NOLINT |
| 20 | 20 |
| 21 #include "platform/utils.h" | 21 #include "platform/utils.h" |
| 22 #include "vm/code_observers.h" | 22 #include "vm/code_observers.h" |
| 23 #include "vm/dart.h" | 23 #include "vm/dart.h" |
| 24 #include "vm/isolate.h" | 24 #include "vm/isolate.h" |
| 25 #include "vm/zone.h" | 25 #include "vm/zone.h" |
| 26 | 26 |
| 27 | 27 |
| 28 namespace dart { | 28 namespace dart { |
| 29 | 29 |
| 30 // Android CodeObservers. | 30 // Android CodeObservers. |
| 31 | 31 |
| 32 #ifndef PRODUCT | 32 #ifndef PRODUCT |
| 33 | 33 |
| 34 DEFINE_FLAG(bool, generate_perf_events_symbols, false, | 34 DEFINE_FLAG(bool, |
| 35 "Generate events symbols for profiling with perf"); | 35 generate_perf_events_symbols, |
| 36 false, |
| 37 "Generate events symbols for profiling with perf"); |
| 36 | 38 |
| 37 class PerfCodeObserver : public CodeObserver { | 39 class PerfCodeObserver : public CodeObserver { |
| 38 public: | 40 public: |
| 39 PerfCodeObserver() : out_file_(NULL) { | 41 PerfCodeObserver() : out_file_(NULL) { |
| 40 Dart_FileOpenCallback file_open = Dart::file_open_callback(); | 42 Dart_FileOpenCallback file_open = Dart::file_open_callback(); |
| 41 if (file_open == NULL) { | 43 if (file_open == NULL) { |
| 42 return; | 44 return; |
| 43 } | 45 } |
| 44 intptr_t pid = getpid(); | 46 intptr_t pid = getpid(); |
| 45 char* filename = OS::SCreate(NULL, "/tmp/perf-%" Pd ".map", pid); | 47 char* filename = OS::SCreate(NULL, "/tmp/perf-%" Pd ".map", pid); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 62 virtual void Notify(const char* name, | 64 virtual void Notify(const char* name, |
| 63 uword base, | 65 uword base, |
| 64 uword prologue_offset, | 66 uword prologue_offset, |
| 65 uword size, | 67 uword size, |
| 66 bool optimized) { | 68 bool optimized) { |
| 67 Dart_FileWriteCallback file_write = Dart::file_write_callback(); | 69 Dart_FileWriteCallback file_write = Dart::file_write_callback(); |
| 68 if ((file_write == NULL) || (out_file_ == NULL)) { | 70 if ((file_write == NULL) || (out_file_ == NULL)) { |
| 69 return; | 71 return; |
| 70 } | 72 } |
| 71 const char* marker = optimized ? "*" : ""; | 73 const char* marker = optimized ? "*" : ""; |
| 72 char* buffer = OS::SCreate(Thread::Current()->zone(), | 74 char* buffer = |
| 73 "%" Px " %" Px " %s%s\n", base, size, marker, name); | 75 OS::SCreate(Thread::Current()->zone(), "%" Px " %" Px " %s%s\n", base, |
| 76 size, marker, name); |
| 74 (*file_write)(buffer, strlen(buffer), out_file_); | 77 (*file_write)(buffer, strlen(buffer), out_file_); |
| 75 } | 78 } |
| 76 | 79 |
| 77 private: | 80 private: |
| 78 void* out_file_; | 81 void* out_file_; |
| 79 | 82 |
| 80 DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver); | 83 DISALLOW_COPY_AND_ASSIGN(PerfCodeObserver); |
| 81 }; | 84 }; |
| 82 | 85 |
| 83 #endif // !PRODUCT | 86 #endif // !PRODUCT |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 int64_t result = ts.tv_sec; | 180 int64_t result = ts.tv_sec; |
| 178 result *= kMicrosecondsPerSecond; | 181 result *= kMicrosecondsPerSecond; |
| 179 result += (ts.tv_nsec / kNanosecondsPerMicrosecond); | 182 result += (ts.tv_nsec / kNanosecondsPerMicrosecond); |
| 180 return result; | 183 return result; |
| 181 } | 184 } |
| 182 | 185 |
| 183 | 186 |
| 184 // TODO(5411554): May need to hoist these architecture dependent code | 187 // TODO(5411554): May need to hoist these architecture dependent code |
| 185 // into a architecture specific file e.g: os_ia32_linux.cc | 188 // into a architecture specific file e.g: os_ia32_linux.cc |
| 186 intptr_t OS::ActivationFrameAlignment() { | 189 intptr_t OS::ActivationFrameAlignment() { |
| 187 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \ | 190 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \ |
| 188 defined(TARGET_ARCH_ARM64) | 191 defined(TARGET_ARCH_ARM64) |
| 189 const int kMinimumAlignment = 16; | 192 const int kMinimumAlignment = 16; |
| 190 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_DBC) | 193 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_DBC) |
| 191 const int kMinimumAlignment = 8; | 194 const int kMinimumAlignment = 8; |
| 192 #else | 195 #else |
| 193 #error Unsupported architecture. | 196 #error Unsupported architecture. |
| 194 #endif | 197 #endif |
| 195 intptr_t alignment = kMinimumAlignment; | 198 intptr_t alignment = kMinimumAlignment; |
| 196 // TODO(5411554): Allow overriding default stack alignment for | 199 // TODO(5411554): Allow overriding default stack alignment for |
| 197 // testing purposes. | 200 // testing purposes. |
| 198 // Flags::DebugIsInt("stackalign", &alignment); | 201 // Flags::DebugIsInt("stackalign", &alignment); |
| 199 ASSERT(Utils::IsPowerOfTwo(alignment)); | 202 ASSERT(Utils::IsPowerOfTwo(alignment)); |
| 200 ASSERT(alignment >= kMinimumAlignment); | 203 ASSERT(alignment >= kMinimumAlignment); |
| 201 return alignment; | 204 return alignment; |
| 202 } | 205 } |
| 203 | 206 |
| 204 | 207 |
| 205 intptr_t OS::PreferredCodeAlignment() { | 208 intptr_t OS::PreferredCodeAlignment() { |
| 206 #if defined(TARGET_ARCH_IA32) || \ | 209 #if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \ |
| 207 defined(TARGET_ARCH_X64) || \ | 210 defined(TARGET_ARCH_ARM64) || defined(TARGET_ARCH_DBC) |
| 208 defined(TARGET_ARCH_ARM64) || \ | |
| 209 defined(TARGET_ARCH_DBC) | |
| 210 const int kMinimumAlignment = 32; | 211 const int kMinimumAlignment = 32; |
| 211 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS) | 212 #elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS) |
| 212 const int kMinimumAlignment = 16; | 213 const int kMinimumAlignment = 16; |
| 213 #else | 214 #else |
| 214 #error Unsupported architecture. | 215 #error Unsupported architecture. |
| 215 #endif | 216 #endif |
| 216 intptr_t alignment = kMinimumAlignment; | 217 intptr_t alignment = kMinimumAlignment; |
| 217 // TODO(5411554): Allow overriding default code alignment for | 218 // TODO(5411554): Allow overriding default code alignment for |
| 218 // testing purposes. | 219 // testing purposes. |
| 219 // Flags::DebugIsInt("codealign", &alignment); | 220 // Flags::DebugIsInt("codealign", &alignment); |
| (...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 | 384 |
| 384 | 385 |
| 385 bool OS::StringToInt64(const char* str, int64_t* value) { | 386 bool OS::StringToInt64(const char* str, int64_t* value) { |
| 386 ASSERT(str != NULL && strlen(str) > 0 && value != NULL); | 387 ASSERT(str != NULL && strlen(str) > 0 && value != NULL); |
| 387 int32_t base = 10; | 388 int32_t base = 10; |
| 388 char* endptr; | 389 char* endptr; |
| 389 int i = 0; | 390 int i = 0; |
| 390 if (str[0] == '-') { | 391 if (str[0] == '-') { |
| 391 i = 1; | 392 i = 1; |
| 392 } | 393 } |
| 393 if ((str[i] == '0') && | 394 if ((str[i] == '0') && (str[i + 1] == 'x' || str[i + 1] == 'X') && |
| 394 (str[i + 1] == 'x' || str[i + 1] == 'X') && | |
| 395 (str[i + 2] != '\0')) { | 395 (str[i + 2] != '\0')) { |
| 396 base = 16; | 396 base = 16; |
| 397 } | 397 } |
| 398 errno = 0; | 398 errno = 0; |
| 399 *value = strtoll(str, &endptr, base); | 399 *value = strtoll(str, &endptr, base); |
| 400 return ((errno == 0) && (endptr != str) && (*endptr == 0)); | 400 return ((errno == 0) && (endptr != str) && (*endptr == 0)); |
| 401 } | 401 } |
| 402 | 402 |
| 403 | 403 |
| 404 void OS::RegisterCodeObservers() { | 404 void OS::RegisterCodeObservers() { |
| (...skipping 18 matching lines...) Expand all Loading... |
| 423 void OS::InitOnce() { | 423 void OS::InitOnce() { |
| 424 // TODO(5411554): For now we check that initonce is called only once, | 424 // TODO(5411554): For now we check that initonce is called only once, |
| 425 // Once there is more formal mechanism to call InitOnce we can move | 425 // Once there is more formal mechanism to call InitOnce we can move |
| 426 // this check there. | 426 // this check there. |
| 427 static bool init_once_called = false; | 427 static bool init_once_called = false; |
| 428 ASSERT(init_once_called == false); | 428 ASSERT(init_once_called == false); |
| 429 init_once_called = true; | 429 init_once_called = true; |
| 430 } | 430 } |
| 431 | 431 |
| 432 | 432 |
| 433 void OS::Shutdown() { | 433 void OS::Shutdown() {} |
| 434 } | |
| 435 | 434 |
| 436 | 435 |
| 437 void OS::Abort() { | 436 void OS::Abort() { |
| 438 abort(); | 437 abort(); |
| 439 } | 438 } |
| 440 | 439 |
| 441 | 440 |
| 442 void OS::Exit(int code) { | 441 void OS::Exit(int code) { |
| 443 exit(code); | 442 exit(code); |
| 444 } | 443 } |
| 445 | 444 |
| 446 } // namespace dart | 445 } // namespace dart |
| 447 | 446 |
| 448 #endif // defined(TARGET_OS_ANDROID) | 447 #endif // defined(TARGET_OS_ANDROID) |
| OLD | NEW |