diff options
author | Ian Rogers <irogers@google.com> | 2014-03-14 17:43:00 -0700 |
---|---|---|
committer | Ian Rogers <irogers@google.com> | 2014-04-01 08:24:16 -0700 |
commit | dd7624d2b9e599d57762d12031b10b89defc9807 (patch) | |
tree | c972296737f992a84b1552561f823991d28403f0 /compiler/trampolines/trampoline_compiler.cc | |
parent | 8464a64a50190c06e95015a932eda9511fa6473d (diff) | |
download | android_art-dd7624d2b9e599d57762d12031b10b89defc9807.tar.gz android_art-dd7624d2b9e599d57762d12031b10b89defc9807.tar.bz2 android_art-dd7624d2b9e599d57762d12031b10b89defc9807.zip |
Allow mixing of thread offsets between 32 and 64bit architectures.
Begin a more full implementation x86-64 REX prefixes.
Doesn't implement 64bit thread offset support for the JNI compiler.
Change-Id: If9af2f08a1833c21ddb4b4077f9b03add1a05147
Diffstat (limited to 'compiler/trampolines/trampoline_compiler.cc')
-rw-r--r-- | compiler/trampolines/trampoline_compiler.cc | 41 |
1 files changed, 26 insertions, 15 deletions
diff --git a/compiler/trampolines/trampoline_compiler.cc b/compiler/trampolines/trampoline_compiler.cc index 32980cba72..fb909a80f8 100644 --- a/compiler/trampolines/trampoline_compiler.cc +++ b/compiler/trampolines/trampoline_compiler.cc @@ -21,6 +21,7 @@ #include "utils/arm64/assembler_arm64.h" #include "utils/mips/assembler_mips.h" #include "utils/x86/assembler_x86.h" +#include "utils/x86_64/assembler_x86_64.h" #define __ assembler-> @@ -28,7 +29,7 @@ namespace art { namespace arm { static const std::vector<uint8_t>* CreateTrampoline(EntryPointCallingConvention abi, - ThreadOffset offset) { + ThreadOffset<4> offset) { UniquePtr<ArmAssembler> assembler(static_cast<ArmAssembler*>(Assembler::Create(kArm))); switch (abi) { @@ -56,7 +57,7 @@ static const std::vector<uint8_t>* CreateTrampoline(EntryPointCallingConvention namespace arm64 { static const std::vector<uint8_t>* CreateTrampoline(EntryPointCallingConvention abi, - ThreadOffset offset) { + ThreadOffset<8> offset) { UniquePtr<Arm64Assembler> assembler(static_cast<Arm64Assembler*>(Assembler::Create(kArm64))); switch (abi) { @@ -96,7 +97,7 @@ static const std::vector<uint8_t>* CreateTrampoline(EntryPointCallingConvention namespace mips { static const std::vector<uint8_t>* CreateTrampoline(EntryPointCallingConvention abi, - ThreadOffset offset) { + ThreadOffset<4> offset) { UniquePtr<MipsAssembler> assembler(static_cast<MipsAssembler*>(Assembler::Create(kMips))); switch (abi) { @@ -125,7 +126,7 @@ static const std::vector<uint8_t>* CreateTrampoline(EntryPointCallingConvention } // namespace mips namespace x86 { -static const std::vector<uint8_t>* CreateTrampoline(ThreadOffset offset) { +static const std::vector<uint8_t>* CreateTrampoline(ThreadOffset<4> offset) { UniquePtr<X86Assembler> assembler(static_cast<X86Assembler*>(Assembler::Create(kX86))); // All x86 trampolines call via the Thread* held in fs. @@ -142,11 +143,12 @@ static const std::vector<uint8_t>* CreateTrampoline(ThreadOffset offset) { } // namespace x86 namespace x86_64 { -static const std::vector<uint8_t>* CreateTrampoline(ThreadOffset offset) { - UniquePtr<x86::X86Assembler> assembler(static_cast<x86::X86Assembler*>(Assembler::Create(kX86_64))); +static const std::vector<uint8_t>* CreateTrampoline(ThreadOffset<8> offset) { + UniquePtr<x86_64::X86_64Assembler> + assembler(static_cast<x86_64::X86_64Assembler*>(Assembler::Create(kX86_64))); // All x86 trampolines call via the Thread* held in gs. - __ gs()->jmp(x86::Address::Absolute(offset, true)); + __ gs()->jmp(x86_64::Address::Absolute(offset, true)); __ int3(); size_t cs = assembler->CodeSize(); @@ -158,23 +160,32 @@ static const std::vector<uint8_t>* CreateTrampoline(ThreadOffset offset) { } } // namespace x86_64 -const std::vector<uint8_t>* CreateTrampoline(InstructionSet isa, EntryPointCallingConvention abi, - ThreadOffset offset) { +const std::vector<uint8_t>* CreateTrampoline64(InstructionSet isa, EntryPointCallingConvention abi, + ThreadOffset<8> offset) { + switch (isa) { + case kArm64: + return arm64::CreateTrampoline(abi, offset); + case kX86_64: + return x86_64::CreateTrampoline(offset); + default: + LOG(FATAL) << "Unexpected InstructionSet: " << isa; + return nullptr; + } +} + +const std::vector<uint8_t>* CreateTrampoline32(InstructionSet isa, EntryPointCallingConvention abi, + ThreadOffset<4> offset) { switch (isa) { case kArm: case kThumb2: return arm::CreateTrampoline(abi, offset); - case kArm64: - return arm64::CreateTrampoline(abi, offset); case kMips: return mips::CreateTrampoline(abi, offset); case kX86: return x86::CreateTrampoline(offset); - case kX86_64: - return x86_64::CreateTrampoline(offset); default: - LOG(FATAL) << "Unknown InstructionSet: " << isa; - return NULL; + LOG(FATAL) << "Unexpected InstructionSet: " << isa; + return nullptr; } } |