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 "parse_options.h"
855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projecttypedef TraceReader<> TraceReaderType;
1055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project#include "parse_options-inl.h"
1255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectvoid Usage(const char *program)
1455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project{
1555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    fprintf(stderr, "Usage: %s [options] trace_file elf_file\n", program);
1655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    OptionsUsage();
1755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
1855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
1955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Projectint main(int argc, char **argv) {
2055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    // Parse the options
2155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    ParseOptions(argc, argv);
2255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    if (argc - optind != 2) {
2355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        Usage(argv[0]);
2455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        exit(1);
2555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
2655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
2755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    char *trace_filename = argv[optind++];
2855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    char *elf_file = argv[optind++];
2955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    TraceReader<> *trace = new TraceReader<>;
3055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    trace->Open(trace_filename);
3155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    trace->ReadKernelSymbols(elf_file);
3255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    trace->SetRoot(root);
3355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
3455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    printf("#  time   bb   pid num_insns  bb_addr\n");
3555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    while (1) {
3655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        symbol_type *sym;
3755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        BBEvent event;
3855a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        BBEvent ignored;
3955a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project
4055a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        if (GetNextValidEvent(trace, &event, &ignored, &sym))
4155a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project            break;
4255a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project        printf("%7lld %4lld %5d       %3d  0x%08x %s\n",
4355a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               event.time, event.bb_num, event.pid, event.num_insns,
4455a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project               event.bb_addr, sym->name);
4555a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    }
4655a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project    return 0;
4755a2c71f27d3e0b8344597c7f281e687cb7aeb1bThe Android Open Source Project}
48