1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #include <dlfcn.h> 18 19 #include "code_simulator_container.h" 20 21 #include "base/globals.h" 22 #include "base/logging.h" // For VLOG. 23 #include "code_simulator.h" 24 25 namespace art { 26 CodeSimulatorContainer(InstructionSet target_isa)27CodeSimulatorContainer::CodeSimulatorContainer(InstructionSet target_isa) 28 : libart_simulator_handle_(nullptr), 29 simulator_(nullptr) { 30 const char* libart_simulator_so_name = 31 kIsDebugBuild ? "libartd-simulator.so" : "libart-simulator.so"; 32 libart_simulator_handle_ = dlopen(libart_simulator_so_name, RTLD_NOW); 33 // It is not a real error when libart-simulator does not exist, e.g., on target. 34 if (libart_simulator_handle_ == nullptr) { 35 VLOG(simulator) << "Could not load " << libart_simulator_so_name << ": " << dlerror(); 36 } else { 37 using CreateCodeSimulatorPtr = CodeSimulator*(*)(InstructionSet); 38 CreateCodeSimulatorPtr create_code_simulator = 39 reinterpret_cast<CreateCodeSimulatorPtr>( 40 dlsym(libart_simulator_handle_, "CreateCodeSimulator")); 41 DCHECK(create_code_simulator != nullptr) << "Fail to find symbol of CreateCodeSimulator: " 42 << dlerror(); 43 simulator_ = create_code_simulator(target_isa); 44 } 45 } 46 ~CodeSimulatorContainer()47CodeSimulatorContainer::~CodeSimulatorContainer() { 48 // Free simulator object before closing libart-simulator because destructor of 49 // CodeSimulator lives in it. 50 if (simulator_ != nullptr) { 51 delete simulator_; 52 } 53 if (libart_simulator_handle_ != nullptr) { 54 dlclose(libart_simulator_handle_); 55 } 56 } 57 58 } // namespace art 59