diff options
author | Ian Rogers <irogers@google.com> | 2014-06-09 04:19:55 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-06-09 04:19:55 +0000 |
commit | 6473c0ab5fe81761c34515c5049d8baf8ee1d35e (patch) | |
tree | 5b037ff93aac1429f947b3b393668721589c0f12 | |
parent | c3ed751a7d7125d0a90161358eeb847f36dfe8f8 (diff) | |
parent | 2f6e3510681cec93e874afd8446db7d4424441b7 (diff) | |
download | android_art-6473c0ab5fe81761c34515c5049d8baf8ee1d35e.tar.gz android_art-6473c0ab5fe81761c34515c5049d8baf8ee1d35e.tar.bz2 android_art-6473c0ab5fe81761c34515c5049d8baf8ee1d35e.zip |
Merge "ART: Fix inline assembly constraints in stub_test"
-rw-r--r-- | runtime/arch/stub_test.cc | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/runtime/arch/stub_test.cc b/runtime/arch/stub_test.cc index 56d51e20f2..3be0faf5ac 100644 --- a/runtime/arch/stub_test.cc +++ b/runtime/arch/stub_test.cc @@ -82,9 +82,9 @@ class StubTest : public CommonRuntimeTest { "addl $4, %%esp" // Pop referrer : "=a" (result) // Use the result from eax - : "a"(arg0), "c"(arg1), "d"(arg2), "D"(code), [referrer]"r"(referrer) - // This places code into edi, arg0 into eax, arg1 into ecx, and arg2 into edx - : ); // clobber. + : "a"(arg0), "c"(arg1), "d"(arg2), "D"(code), [referrer]"r"(referrer) + // This places code into edi, arg0 into eax, arg1 into ecx, and arg2 into edx + : "memory"); // clobber. // TODO: Should we clobber the other registers? EBX gets clobbered by some of the stubs, // but compilation fails when declaring that. #elif defined(__arm__) @@ -122,7 +122,7 @@ class StubTest : public CommonRuntimeTest { // Use the result from r0 : [arg0] "r"(arg0), [arg1] "r"(arg1), [arg2] "r"(arg2), [code] "r"(code), [self] "r"(self), [referrer] "r"(referrer) - : ); // clobber. + : "memory"); // clobber. #elif defined(__aarch64__) __asm__ __volatile__( // Spill x0-x7 which we say we don't clobber. May contain args. @@ -255,7 +255,8 @@ class StubTest : public CommonRuntimeTest { "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", - "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31"); // clobber. + "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", + "memory"); // clobber. #elif defined(__x86_64__) // Note: Uses the native convention // TODO: Set the thread? @@ -268,9 +269,10 @@ class StubTest : public CommonRuntimeTest { ".cfi_adjust_cfa_offset -16\n\t" : "=a" (result) // Use the result from rax - : "D"(arg0), "S"(arg1), "d"(arg2), "a"(code), [referrer] "m"(referrer) - // This places arg0 into rdi, arg1 into rsi, arg2 into rdx, and code into rax - : "rbx", "rcx", "rbp", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); // clobber all + : "D"(arg0), "S"(arg1), "d"(arg2), "a"(code), [referrer] "m"(referrer) + // This places arg0 into rdi, arg1 into rsi, arg2 into rdx, and code into rax + : "rbx", "rcx", "rbp", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "memory"); // clobber all // TODO: Should we clobber the other registers? #else LOG(WARNING) << "Was asked to invoke for an architecture I do not understand."; @@ -303,9 +305,9 @@ class StubTest : public CommonRuntimeTest { "addl $4, %%esp" // Pop referrer : "=a" (result) // Use the result from eax - : "a"(arg0), "c"(arg1), "d"(arg2), "D"(code), [referrer]"m"(referrer), [hidden]"r"(hidden) - // This places code into edi, arg0 into eax, arg1 into ecx, and arg2 into edx - : ); // clobber. + : "a"(arg0), "c"(arg1), "d"(arg2), "D"(code), [referrer]"m"(referrer), [hidden]"r"(hidden) + // This places code into edi, arg0 into eax, arg1 into ecx, and arg2 into edx + : "memory"); // clobber. // TODO: Should we clobber the other registers? EBX gets clobbered by some of the stubs, // but compilation fails when declaring that. #elif defined(__arm__) @@ -343,9 +345,9 @@ class StubTest : public CommonRuntimeTest { "mov %[result], r0\n\t" // Save the result : [result] "=r" (result) // Use the result from r0 - : [arg0] "r"(arg0), [arg1] "r"(arg1), [arg2] "r"(arg2), [code] "r"(code), [self] "r"(self), - [referrer] "r"(referrer), [hidden] "r"(hidden) - : ); // clobber. + : [arg0] "r"(arg0), [arg1] "r"(arg1), [arg2] "r"(arg2), [code] "r"(code), [self] "r"(self), + [referrer] "r"(referrer), [hidden] "r"(hidden) + : "memory"); // clobber. #elif defined(__aarch64__) __asm__ __volatile__( // Spill x0-x7 which we say we don't clobber. May contain args. @@ -477,7 +479,8 @@ class StubTest : public CommonRuntimeTest { "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d8", "d9", "d10", "d11", "d12", "d13", "d14", "d15", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", - "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31"); // clobber. + "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", + "memory"); // clobber. #elif defined(__x86_64__) // Note: Uses the native convention // TODO: Set the thread? @@ -494,7 +497,8 @@ class StubTest : public CommonRuntimeTest { // Use the result from rax : "D"(arg0), "S"(arg1), "d"(arg2), "a"(code), [referrer] "m"(referrer), [hidden] "m"(hidden) // This places arg0 into rdi, arg1 into rsi, arg2 into rdx, and code into rax - : "rbx", "rcx", "rbp", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"); // clobber all + : "rbx", "rcx", "rbp", "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15", + "memory"); // clobber all // TODO: Should we clobber the other registers? #else LOG(WARNING) << "Was asked to invoke for an architecture I do not understand."; |