1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2014 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker #ifndef ART_COMPILER_UTILS_JNI_MACRO_ASSEMBLER_TEST_H_ 18*795d594fSAndroid Build Coastguard Worker #define ART_COMPILER_UTILS_JNI_MACRO_ASSEMBLER_TEST_H_ 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker #include "jni_macro_assembler.h" 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker #include "assembler_test_base.h" 23*795d594fSAndroid Build Coastguard Worker #include "base/macros.h" 24*795d594fSAndroid Build Coastguard Worker #include "base/malloc_arena_pool.h" 25*795d594fSAndroid Build Coastguard Worker #include "common_runtime_test.h" // For ScratchFile 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker #include <sys/stat.h> 28*795d594fSAndroid Build Coastguard Worker 29*795d594fSAndroid Build Coastguard Worker #include <cstdio> 30*795d594fSAndroid Build Coastguard Worker #include <cstdlib> 31*795d594fSAndroid Build Coastguard Worker #include <fstream> 32*795d594fSAndroid Build Coastguard Worker #include <iterator> 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker namespace art HIDDEN { 35*795d594fSAndroid Build Coastguard Worker 36*795d594fSAndroid Build Coastguard Worker template<typename Ass> 37*795d594fSAndroid Build Coastguard Worker class JNIMacroAssemblerTest : public AssemblerTestBase { 38*795d594fSAndroid Build Coastguard Worker public: GetAssembler()39*795d594fSAndroid Build Coastguard Worker Ass* GetAssembler() { 40*795d594fSAndroid Build Coastguard Worker return assembler_.get(); 41*795d594fSAndroid Build Coastguard Worker } 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker using TestFn = std::string (*)(JNIMacroAssemblerTest *, Ass *); 44*795d594fSAndroid Build Coastguard Worker DriverFn(TestFn f,const std::string & test_name)45*795d594fSAndroid Build Coastguard Worker void DriverFn(TestFn f, const std::string& test_name) { 46*795d594fSAndroid Build Coastguard Worker DriverWrapper(f(this, assembler_.get()), test_name); 47*795d594fSAndroid Build Coastguard Worker } 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker // This driver assumes the assembler has already been called. DriverStr(const std::string & assembly_string,const std::string & test_name)50*795d594fSAndroid Build Coastguard Worker void DriverStr(const std::string& assembly_string, const std::string& test_name) { 51*795d594fSAndroid Build Coastguard Worker DriverWrapper(assembly_string, test_name); 52*795d594fSAndroid Build Coastguard Worker } 53*795d594fSAndroid Build Coastguard Worker 54*795d594fSAndroid Build Coastguard Worker protected: JNIMacroAssemblerTest()55*795d594fSAndroid Build Coastguard Worker JNIMacroAssemblerTest() {} 56*795d594fSAndroid Build Coastguard Worker SetUp()57*795d594fSAndroid Build Coastguard Worker void SetUp() override { 58*795d594fSAndroid Build Coastguard Worker AssemblerTestBase::SetUp(); 59*795d594fSAndroid Build Coastguard Worker allocator_.reset(new ArenaAllocator(&pool_)); 60*795d594fSAndroid Build Coastguard Worker assembler_.reset(CreateAssembler(allocator_.get())); 61*795d594fSAndroid Build Coastguard Worker SetUpHelpers(); 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker TearDown()64*795d594fSAndroid Build Coastguard Worker void TearDown() override { 65*795d594fSAndroid Build Coastguard Worker AssemblerTestBase::TearDown(); 66*795d594fSAndroid Build Coastguard Worker assembler_.reset(); 67*795d594fSAndroid Build Coastguard Worker allocator_.reset(); 68*795d594fSAndroid Build Coastguard Worker } 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker // Override this to set up any architecture-specific things, e.g., CPU revision. CreateAssembler(ArenaAllocator * allocator)71*795d594fSAndroid Build Coastguard Worker virtual Ass* CreateAssembler(ArenaAllocator* allocator) { 72*795d594fSAndroid Build Coastguard Worker return new (allocator) Ass(allocator); 73*795d594fSAndroid Build Coastguard Worker } 74*795d594fSAndroid Build Coastguard Worker 75*795d594fSAndroid Build Coastguard Worker // Override this to set up any architecture-specific things, e.g., register vectors. SetUpHelpers()76*795d594fSAndroid Build Coastguard Worker virtual void SetUpHelpers() {} 77*795d594fSAndroid Build Coastguard Worker 78*795d594fSAndroid Build Coastguard Worker private: 79*795d594fSAndroid Build Coastguard Worker // Override this to pad the code with NOPs to a certain size if needed. Pad(std::vector<uint8_t> & data)80*795d594fSAndroid Build Coastguard Worker virtual void Pad([[maybe_unused]] std::vector<uint8_t>& data) {} 81*795d594fSAndroid Build Coastguard Worker DriverWrapper(const std::string & assembly_text,const std::string & test_name)82*795d594fSAndroid Build Coastguard Worker void DriverWrapper(const std::string& assembly_text, const std::string& test_name) { 83*795d594fSAndroid Build Coastguard Worker assembler_->FinalizeCode(); 84*795d594fSAndroid Build Coastguard Worker size_t cs = assembler_->CodeSize(); 85*795d594fSAndroid Build Coastguard Worker std::unique_ptr<std::vector<uint8_t>> data(new std::vector<uint8_t>(cs)); 86*795d594fSAndroid Build Coastguard Worker MemoryRegion code(&(*data)[0], data->size()); 87*795d594fSAndroid Build Coastguard Worker assembler_->CopyInstructions(code); 88*795d594fSAndroid Build Coastguard Worker Pad(*data); 89*795d594fSAndroid Build Coastguard Worker Driver(*data, assembly_text, test_name); 90*795d594fSAndroid Build Coastguard Worker } 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker MallocArenaPool pool_; 93*795d594fSAndroid Build Coastguard Worker std::unique_ptr<ArenaAllocator> allocator_; 94*795d594fSAndroid Build Coastguard Worker std::unique_ptr<Ass> assembler_; 95*795d594fSAndroid Build Coastguard Worker 96*795d594fSAndroid Build Coastguard Worker DISALLOW_COPY_AND_ASSIGN(JNIMacroAssemblerTest); 97*795d594fSAndroid Build Coastguard Worker }; 98*795d594fSAndroid Build Coastguard Worker 99*795d594fSAndroid Build Coastguard Worker } // namespace art 100*795d594fSAndroid Build Coastguard Worker 101*795d594fSAndroid Build Coastguard Worker #endif // ART_COMPILER_UTILS_JNI_MACRO_ASSEMBLER_TEST_H_ 102