155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <stdio.h>
255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <unistd.h>
355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <stdlib.h>
455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <inttypes.h>
555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include <assert.h>
655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "trace_reader.h"
755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "armdis.h"
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "parse_options.h"
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projecttypedef TraceReader<> TraceReaderType;
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "parse_options-inl.h"
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectstatic const uint32_t kOffsetThreshold = 0x100000;
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectvoid Usage(const char *program)
1755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project{
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    fprintf(stderr, "Usage: %s [options] trace_file elf_file\n", program);
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    OptionsUsage();
2055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectint main(int argc, char **argv) {
2355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // Parse the options
2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    ParseOptions(argc, argv);
2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    if (argc - optind != 2) {
2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Usage(argv[0]);
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        exit(1);
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    char *trace_filename = argv[optind++];
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    char *elf_file = argv[optind++];
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    TraceReader<> *trace = new TraceReader<>;
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    trace->Open(trace_filename);
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    trace->ReadKernelSymbols(elf_file);
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    trace->SetRoot(root);
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    while (1) {
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        symbol_type *sym;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        BBEvent event;
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        BBEvent ignored;
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (GetNextValidEvent(trace, &event, &ignored, &sym))
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            break;
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (event.bb_num == 0)
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            break;
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        //printf("t%llu bb %lld %d\n", event.time, event.bb_num, event.num_insns);
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        uint64_t insn_time = trace->ReadInsnTime(event.time);
4855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (insn_time != event.time) {
4955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            printf("time: %llu insn time: %llu bb: %llu addr: 0x%x num_insns: %d, pid: %d\n",
5055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   event.time, insn_time, event.bb_num, event.bb_addr,
5155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project                   event.num_insns, event.pid);
5255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            exit(1);
5355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
5455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        for (int ii = 1; ii < event.num_insns; ++ii) {
5555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            trace->ReadInsnTime(event.time);
5655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        }
5755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
5855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
5955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    delete trace;
6055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    return 0;
6155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
62