/* * Copyright 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "vts_measurement.h" #if USE_CTIME #include <time.h> #else #include <sys/time.h> #endif #include <stdlib.h> #include <iostream> #define COVERAGE_SANCOV 0 #if COVERAGE_SANCOV #include <sanitizer/coverage_interface.h> #endif #include <vector> using namespace std; #if COVERAGE_SANCOV extern "C" { // Re-declare some of the sanitizer functions as "weak" so that // libFuzzer can be linked w/o the sanitizers and sanitizer-coverage // (in which case it will complain at start-up time). __attribute__((weak)) void __sanitizer_print_stack_trace(); __attribute__((weak)) void __sanitizer_reset_coverage(); __attribute__((weak)) size_t __sanitizer_get_total_unique_caller_callee_pairs(); __attribute__((weak)) size_t __sanitizer_get_total_unique_coverage(); __attribute__((weak)) void __sanitizer_set_death_callback( void (*callback)(void)); __attribute__((weak)) size_t __sanitizer_get_number_of_counters(); __attribute__((weak)) uintptr_t __sanitizer_update_counter_bitset_and_clear_counters(uint8_t* bitset); } #define CHECK_WEAK_API_FUNCTION(fn) \ do { \ if (!fn) MissingWeakApiFunction(#fn); \ } while (false) static void MissingWeakApiFunction(const char* FnName) { cerr << "ERROR: " << FnName << " is not defined. Exiting.\n" << "Did you use -fsanitize-coverage=... to build your code?" << endl; exit(1); } #endif namespace android { namespace vts { void VtsMeasurement::Start() { #if COVERAGE_SANCOV cout << "reset coverage"; CHECK_WEAK_API_FUNCTION(__sanitizer_reset_coverage); __sanitizer_reset_coverage(); cout << endl; #endif #if USE_CTIME gettimeofday(&tv_, NULL); #else clock_gettime(CLOCK_REALTIME, &ts_); #endif } vector<float>* VtsMeasurement::Stop() { #if USE_CTIME struct timeval curr_tv; gettimeofday(&curr_tv, NULL); #else timespec ts_now; clock_gettime(CLOCK_REALTIME, &ts_now); #endif vector<float>* result = new vector<float>; #if USE_CTIME float stop_time_usecs; float start_time_usecs; stop_time_usecs = curr_tv.tv_sec + curr_tv.tv_usec / 1000000.0; start_time_usecs = tv_.tv_sec + tv_.tv_usec / 1000000.0; result->push_back(stop_time_usecs - start_time_usecs); #else float stop_time_usecs; float start_time_usecs; stop_time_usecs = ts_now.tv_sec + ts_now.tv_nsec / 1000000000.0; start_time_usecs = ts_.tv_sec + ts_.tv_nsec / 1000000000.0; result->push_back(stop_time_usecs - start_time_usecs); #endif #if COVERAGE_SANCOV cout << "coverage: "; cout << __sanitizer_get_total_unique_caller_callee_pairs() << endl; #endif return result; } } // namespace vts } // namespace android