Index: runtime/vm/os_fuchsia.cc |
diff --git a/runtime/vm/os_fuchsia.cc b/runtime/vm/os_fuchsia.cc |
index 10faf1c66a977f41db125a8fd0ff83ec51fc2e32..db9264ee2a3526de093d404118e306413dbd7e66 100644 |
--- a/runtime/vm/os_fuchsia.cc |
+++ b/runtime/vm/os_fuchsia.cc |
@@ -11,6 +11,7 @@ |
#include <magenta/types.h> |
#include "platform/assert.h" |
+#include "vm/zone.h" |
namespace dart { |
@@ -54,20 +55,19 @@ int64_t OS::GetCurrentTimeMicros() { |
int64_t OS::GetCurrentMonotonicTicks() { |
- UNIMPLEMENTED(); |
- return 0; |
+ return _magenta_current_time(); |
} |
int64_t OS::GetCurrentMonotonicFrequency() { |
- UNIMPLEMENTED(); |
- return 0; |
+ return kNanosecondsPerSecond; |
} |
int64_t OS::GetCurrentMonotonicMicros() { |
- UNIMPLEMENTED(); |
- return 0; |
+ int64_t ticks = GetCurrentMonotonicTicks(); |
+ ASSERT(GetCurrentMonotonicFrequency() == kNanosecondsPerSecond); |
+ return ticks / kNanosecondsPerMicrosecond; |
} |
@@ -89,16 +89,45 @@ void OS::AlignedFree(void* ptr) { |
// TODO(5411554): May need to hoist these architecture dependent code |
-// into a architecture specific file e.g: os_ia32_linux.cc |
+// into a architecture specific file e.g: os_ia32_fuchsia.cc |
intptr_t OS::ActivationFrameAlignment() { |
- UNIMPLEMENTED(); |
- return 0; |
+#if defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_X64) || \ |
+ defined(TARGET_ARCH_ARM64) |
+ const int kMinimumAlignment = 16; |
+#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_DBC) |
+ const int kMinimumAlignment = 8; |
+#else |
+#error Unsupported architecture. |
+#endif |
+ intptr_t alignment = kMinimumAlignment; |
+ // TODO(5411554): Allow overriding default stack alignment for |
+ // testing purposes. |
+ // Flags::DebugIsInt("stackalign", &alignment); |
+ ASSERT(Utils::IsPowerOfTwo(alignment)); |
+ ASSERT(alignment >= kMinimumAlignment); |
+ return alignment; |
} |
intptr_t OS::PreferredCodeAlignment() { |
- UNIMPLEMENTED(); |
- return 0; |
+#if defined(TARGET_ARCH_IA32) || \ |
+ defined(TARGET_ARCH_X64) || \ |
+ defined(TARGET_ARCH_ARM64) || \ |
+ defined(TARGET_ARCH_DBC) |
+ const int kMinimumAlignment = 32; |
+#elif defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_MIPS) |
+ const int kMinimumAlignment = 16; |
+#else |
+#error Unsupported architecture. |
+#endif |
+ intptr_t alignment = kMinimumAlignment; |
+ // TODO(5411554): Allow overriding default code alignment for |
+ // testing purposes. |
+ // Flags::DebugIsInt("codealign", &alignment); |
+ ASSERT(Utils::IsPowerOfTwo(alignment)); |
+ ASSERT(alignment >= kMinimumAlignment); |
+ ASSERT(alignment <= OS::kMaxPreferredCodeAlignment); |
+ return alignment; |
} |
@@ -153,26 +182,53 @@ void OS::VFPrint(FILE* stream, const char* format, va_list args) { |
int OS::SNPrint(char* str, size_t size, const char* format, ...) { |
- UNIMPLEMENTED(); |
- return 0; |
+ va_list args; |
+ va_start(args, format); |
+ int retval = VSNPrint(str, size, format, args); |
+ va_end(args); |
+ return retval; |
} |
int OS::VSNPrint(char* str, size_t size, const char* format, va_list args) { |
- UNIMPLEMENTED(); |
- return 0; |
+ int retval = vsnprintf(str, size, format, args); |
+ if (retval < 0) { |
+ FATAL1("Fatal error in OS::VSNPrint with format '%s'", format); |
+ } |
+ return retval; |
} |
char* OS::SCreate(Zone* zone, const char* format, ...) { |
- UNIMPLEMENTED(); |
- return NULL; |
+ va_list args; |
+ va_start(args, format); |
+ char* buffer = VSCreate(zone, format, args); |
+ va_end(args); |
+ return buffer; |
} |
char* OS::VSCreate(Zone* zone, const char* format, va_list args) { |
- UNIMPLEMENTED(); |
- return NULL; |
+ // Measure. |
+ va_list measure_args; |
+ va_copy(measure_args, args); |
+ intptr_t len = VSNPrint(NULL, 0, format, measure_args); |
+ va_end(measure_args); |
+ |
+ char* buffer; |
+ if (zone) { |
+ buffer = zone->Alloc<char>(len + 1); |
+ } else { |
+ buffer = reinterpret_cast<char*>(malloc(len + 1)); |
+ } |
+ ASSERT(buffer != NULL); |
+ |
+ // Print. |
+ va_list print_args; |
+ va_copy(print_args, args); |
+ VSNPrint(buffer, len + 1, format, print_args); |
+ va_end(print_args); |
+ return buffer; |
} |