119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier/* 219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * Copyright (C) 2015 The Android Open Source Project 319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * 419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * Licensed under the Apache License, Version 2.0 (the "License"); 519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * you may not use this file except in compliance with the License. 619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * You may obtain a copy of the License at 719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * 819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * http://www.apache.org/licenses/LICENSE-2.0 919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * 1019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * Unless required by applicable law or agreed to in writing, software 1119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * distributed under the License is distributed on an "AS IS" BASIS, 1219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * See the License for the specific language governing permissions and 1419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier * limitations under the License. 1519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier */ 1619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 1719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include <string> 1819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include <vector> 1919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include <sstream> 2019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 2119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "common_runtime_test.h" 2219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 2319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "base/stringprintf.h" 2419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "runtime/arch/instruction_set.h" 2519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "runtime/gc/heap.h" 2619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "runtime/gc/space/image_space.h" 2719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "runtime/os.h" 2819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "runtime/utils.h" 2919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include "utils.h" 3019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 3119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include <sys/types.h> 3219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier#include <unistd.h> 3319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 3419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartiernamespace art { 3519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 3619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartierclass OatDumpTest : public CommonRuntimeTest { 3719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier protected: 3819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier virtual void SetUp() { 3919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier CommonRuntimeTest::SetUp(); 4019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier core_art_location_ = GetCoreArtLocation(); 4119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier core_oat_location_ = GetSystemImageFilename(GetCoreOatLocation().c_str(), kRuntimeISA); 4219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } 4319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 4419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier // Returns path to the oatdump binary. 4519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string GetOatDumpFilePath() { 4619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string root = GetTestAndroidRoot(); 4719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier root += "/bin/oatdump"; 4819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier if (kIsDebugBuild) { 4919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier root += "d"; 5019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } 5119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier return root; 5219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } 5319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 5419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier enum Mode { 5519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier kModeOat, 5619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier kModeArt, 5719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier kModeSymbolize, 5819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier }; 5919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 6019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier // Run the test with custom arguments. 6119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier bool Exec(Mode mode, const std::vector<std::string>& args, std::string* error_msg) { 6219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string file_path = GetOatDumpFilePath(); 6319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 6419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier EXPECT_TRUE(OS::FileExists(file_path.c_str())) << file_path << " should be a valid file path"; 6519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 6619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::vector<std::string> exec_argv = { file_path }; 6719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier if (mode == kModeSymbolize) { 6819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.push_back("--symbolize=" + core_oat_location_); 6919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.push_back("--output=" + core_oat_location_ + ".symbolize"); 7019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } else if (mode == kModeArt) { 7119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.push_back("--image=" + core_art_location_); 7271f2e80e723dd5d7b9fe55e1ee70d196531921adAndreas Gampe exec_argv.push_back("--instruction-set=" + std::string(GetInstructionSetString(kRuntimeISA))); 7319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.push_back("--output=/dev/null"); 7419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } else { 7519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier CHECK_EQ(static_cast<size_t>(mode), static_cast<size_t>(kModeOat)); 7619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.push_back("--oat-file=" + core_oat_location_); 7719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.push_back("--output=/dev/null"); 7819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } 7919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier exec_argv.insert(exec_argv.end(), args.begin(), args.end()); 8019510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier return ::art::Exec(exec_argv, error_msg); 8119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier } 8219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 8319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier private: 8419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string core_art_location_; 8519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string core_oat_location_; 8619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier}; 8719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 887da317019d386b9f0b06ae6473d21ed5d675100eVladimir Marko// Disable tests on arm and mips as they are taking too long to run. b/27824283. 897da317019d386b9f0b06ae6473d21ed5d675100eVladimir Marko#if !defined(__arm__) && !defined(__mips__) 9019510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestImage) { 9119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 9219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeArt, {}, &error_msg)) << error_msg; 9319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 9419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 9519510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestOatImage) { 9619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 9719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeOat, {}, &error_msg)) << error_msg; 9819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 9919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 10019510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestNoDumpVmap) { 10119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 10219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeArt, {"--no-dump:vmap"}, &error_msg)) << error_msg; 10319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 10419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 10519510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestNoDisassemble) { 10619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 10719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeArt, {"--no-disassemble"}, &error_msg)) << error_msg; 10819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 10919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 11019510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestListClasses) { 11119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 11219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeArt, {"--list-classes"}, &error_msg)) << error_msg; 11319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 11419510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 11519510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestListMethods) { 11619510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 11719510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeArt, {"--list-methods"}, &error_msg)) << error_msg; 11819510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 11919510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier 12019510f02b011e545665f6219e6144c8e47aed5f0Mathieu ChartierTEST_F(OatDumpTest, TestSymbolize) { 12119510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier std::string error_msg; 12219510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier ASSERT_TRUE(Exec(kModeSymbolize, {}, &error_msg)) << error_msg; 12319510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} 124973ce7cc191295b8bcc3387dfe264586677507e0Nicolas Geoffray#endif 12519510f02b011e545665f6219e6144c8e47aed5f0Mathieu Chartier} // namespace art 126