#!/usr/bin/python2.4 -E

import os
import re
import sys

def PrintUsage():
    print "Usage:" + sys.argv[0] + " [-r] dir"
    print "    -r : reuse the directory if it already exists"
    print "    dir: directory on the host to store profile results"

if (len(sys.argv) > 3):
    PrintUsage()
    sys.exit(1)

# identify 32-bit vs 64-bit platform
stream = os.popen("uname -m")
arch_name = stream.readline().rstrip("\n");
stream.close()

# default path is prebuilt/linux-x86/oprofile
# for 64-bit OS, use prebuilt/linux-x86_64/oprofile instead
if arch_name == "x86_64":
    arch_path = "/../../linux-x86_64/oprofile"
else:
    arch_path = ""

try:
    oprofile_event_dir = os.environ['OPROFILE_EVENTS_DIR']
except:
    print "OPROFILE_EVENTS_DIR not set. Run \". envsetup.sh\" first"
    sys.exit(1)

if sys.argv[1] == "-r" :
    replace_dir = 1
    output_dir = sys.argv[2]
else:
    replace_dir = 0
    output_dir = sys.argv[1]

if (os.path.exists(output_dir) and (replace_dir == 1)):
    os.system("rm -fr " + output_dir)

try:
    os.makedirs(output_dir)
except:
    if os.path.exists(output_dir):
        print "Directory already exists:", output_dir
        print "Try \"" + sys.argv[0] + " -r " + output_dir + "\""
    else:
        print "Cannot create", output_dir
    sys.exit(1)

# get the samples off the phone
result = os.system("adb pull /data/oprofile/samples " + output_dir + \
                   "/raw_samples > /dev/null 2>&1")
if result != 0:
    print "adb pull failure, exiting"
    sys.exit(1)

# enter the destination directory
os.chdir(output_dir)
stream = os.popen("find raw_samples -type f -name \*all")

# now all the sample files are on the host, we need to invoke opimport one at a
# time to convert the content from the ARM abi to x86 ABI

# break the full filename into:
# 1: leading dir: "raw_samples"
# 2: intermediate dirs: "/blah/blah/blah"
# 3: filename: e.g. "CPU_CYCLES.150000.0.all.all.all"
pattern = re.compile("(^raw_samples)(.*)/(.*)$")
for line in stream:
    match = pattern.search(line)
    leading_dir = match.group(1)
    middle_part = match.group(2)
    file_name = match.group(3)

    dir = "samples" + middle_part

    # if multiple events are collected the directory could have been setup
    if not os.path.exists(dir):
        os.makedirs(dir)

    cmd = oprofile_event_dir + arch_path + "/bin/opimport -a " + \
          oprofile_event_dir + \
          "/abi/arm_abi -o samples" + middle_part + "/" + file_name + " " + line
    os.system(cmd)

stream.close()

# short summary of profiling results
os.system(oprofile_event_dir + arch_path + "/bin/opreport --session-dir=.")
