You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
120 lines
3.2 KiB
120 lines
3.2 KiB
/*
|
|
* 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
|