| /* |
| * 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 |