diff options
| author | Koen Kooi <koen@openembedded.org> | 2008-06-17 12:51:00 +0000 |
|---|---|---|
| committer | Koen Kooi <koen@openembedded.org> | 2008-06-17 12:51:00 +0000 |
| commit | d2fc8b2c55b1e16784716a06d16705fb6d72cb11 (patch) | |
| tree | eb4b40b18294a53bcb1adbc9f87589a0775bc56e | |
| parent | d189f18f99cd20ebed5c0a5b16cbfb6436229373 (diff) | |
oprofile: sync with poky
| -rw-r--r-- | conf/distro/include/sane-srcdates.inc | 2 | ||||
| -rw-r--r-- | conf/distro/include/sane-srcrevs.inc | 2 | ||||
| -rw-r--r-- | packages/oprofile/oprofile/armv6_fix.patch | 54 | ||||
| -rw-r--r-- | packages/oprofile/oprofile/fix-arith.patch | 52 | ||||
| -rw-r--r-- | packages/oprofile/oprofile/oparchive_fix.patch | 22 | ||||
| -rw-r--r-- | packages/oprofile/oprofile/opstart.patch | 235 | ||||
| -rw-r--r-- | packages/oprofile/oprofile/root_option.patch | 1051 | ||||
| -rw-r--r-- | packages/oprofile/oprofile/xml_callgraph_details.patch | 232 | ||||
| -rw-r--r-- | packages/oprofile/oprofile_0.9.3.bb | 22 | ||||
| -rw-r--r-- | packages/oprofile/oprofile_cvs.bb | 8 | ||||
| -rw-r--r-- | packages/oprofile/oprofileui-svn.inc | 8 | ||||
| -rw-r--r-- | packages/oprofile/oprofileui.inc | 16 | ||||
| -rw-r--r-- | packages/oprofile/oprofileui_svn.bb | 2 |
13 files changed, 1690 insertions, 16 deletions
diff --git a/conf/distro/include/sane-srcdates.inc b/conf/distro/include/sane-srcdates.inc index c5b969bb7e..10a0330f17 100644 --- a/conf/distro/include/sane-srcdates.inc +++ b/conf/distro/include/sane-srcdates.inc @@ -139,7 +139,7 @@ SRCDATE_mpd ?= "20070210" SRCDATE_mystun-server ?= "20060814" SRCDATE_olsrd ?= "20060814" SRCDATE_opencvs ?= "20060814" -SRCDATE_oprofile ?= "20061011" +SRCDATE_oprofile ?= "20080210" SRCDATE_portaudio ?= "20060814" SRCDATE_putty ?= "20060814" SRCDATE_python-cairo ?= "20060814" diff --git a/conf/distro/include/sane-srcrevs.inc b/conf/distro/include/sane-srcrevs.inc index 0cd23c21bd..08575018fc 100644 --- a/conf/distro/include/sane-srcrevs.inc +++ b/conf/distro/include/sane-srcrevs.inc @@ -158,7 +158,7 @@ SRCREV_pn-openocd-native ?= "517" SRCREV_pn-opkg ?= "4488" SRCREV_pn-opkg-native ?= "4452" SRCREV_pn-opkg-sdk ?= "4488" -SRCREV_pn-oprofileui ?= "160" +SRCREV_pn-oprofileui ?= "173" SRCREV_pn-packagekit ?= "813fa8cfb139246cf180d52895b52b28616ae2f5" SRCREV_pn-psplash ?= "249" SRCREV_pn-pty-forward-native ?= "4214" diff --git a/packages/oprofile/oprofile/armv6_fix.patch b/packages/oprofile/oprofile/armv6_fix.patch new file mode 100644 index 0000000000..b981871e6e --- /dev/null +++ b/packages/oprofile/oprofile/armv6_fix.patch @@ -0,0 +1,54 @@ +--- + events/arm/armv6/events | 43 +++++++++++++++++++++---------------------- + 1 file changed, 21 insertions(+), 22 deletions(-) + +Index: oprofile-0.9.3/events/arm/armv6/events +=================================================================== +--- oprofile-0.9.3.orig/events/arm/armv6/events 2007-07-16 19:22:17.000000000 +0100 ++++ oprofile-0.9.3/events/arm/armv6/events 2007-09-28 11:13:32.000000000 +0100 +@@ -1,24 +1,23 @@ + # ARM V6 events + # +-event:0x00 counters:1,2 um:zero minimum:500 name:IFU_IFETCH_MISS : number of instruction fetch misses +-event:0x01 counters:1,2 um:zero minimum:500 name:CYCLES_IFU_MEM_STALL : cycles instruction fetch pipe is stalled +-event:0x02 counters:1,2 um:zero minimum:500 name:CYCLES_DATA_STALL : cycles stall occurs for due to data dependency +-event:0x03 counters:1,2 um:zero minimum:500 name:ITLB_MISS : number of Instruction MicroTLB misses +-event:0x04 counters:1,2 um:zero minimum:500 name:DTLB_MISS : number of Data MicroTLB misses +-event:0x05 counters:1,2 um:zero minimum:500 name:BR_INST_EXECUTED : branch instruction executed w/ or w/o program flow change +-event:0x06 counters:1,2 um:zero minimum:500 name:BR_INST_MISS_PRED : branch mispredicted +-event:0x07 counters:1,2 um:zero minimum:500 name:INSN_EXECUTED : instructions executed +-event:0x09 counters:1,2 um:zero minimum:500 name:DCACHE_ACCESS : data cache access, cacheable locations +-event:0x0a counters:1,2 um:zero minimum:500 name:DCACHE_ACCESS_ALL : data cache access, all locations +-event:0x0b counters:1,2 um:zero minimum:500 name:DCACHE_MISS : data cache miss +-event:0x0c counters:1,2 um:zero minimum:500 name:DCACHE_WB : data cache writeback, 1 event for every half cacheline +-event:0x0d counters:1,2 um:zero minimum:500 name:PC_CHANGE : number of times the program counter was changed without a mode switch +-event:0x0f counters:1,2 um:zero minimum:500 name:TLB_MISS : Main TLB miss +-event:0x10 counters:1,2 um:zero minimum:500 name:EXP_EXTERNAL : Explict external data access +-event:0x11 counters:1,2 um:zero minimum:500 name:LSU_STALL : cycles stalled because Load Store request queque is full +-event:0x12 counters:1,2 um:zero minimum:500 name:WRITE_DRAIN : Times write buffer was drained +-event:0x20 counters:1,2 um:zero minimum:500 name:ETMEXTOUT0 : nuber of cycles ETMEXTOUT[0] signal was asserted +-event:0x21 counters:1,2 um:zero minimum:500 name:ETMEXTOUT1 : nuber of cycles ETMEXTOUT[1] signal was asserted +-event:0x22 counters:1,2 um:zero minimum:500 name:ETMEXTOUT_BOTH : nuber of cycles both ETMEXTOUT [0] and [1] were asserted * 2 +-event:0xff counters:1,2 um:zero minimum:500 name:CPU_CYCLES2 : clock cycles counter +-event:0xfe counters:0 um:zero minimum:500 name:CPU_CYCLES : clock cycles counter ++event:0x00 counters:0,1 um:zero minimum:500 name:IFU_IFETCH_MISS : number of instruction fetch misses ++event:0x01 counters:0,1 um:zero minimum:500 name:CYCLES_IFU_MEM_STALL : cycles instruction fetch pipe is stalled ++event:0x02 counters:0,1 um:zero minimum:500 name:CYCLES_DATA_STALL : cycles stall occurs for due to data dependency ++event:0x03 counters:0,1 um:zero minimum:500 name:ITLB_MISS : number of Instruction MicroTLB misses ++event:0x04 counters:0,1 um:zero minimum:500 name:DTLB_MISS : number of Data MicroTLB misses ++event:0x05 counters:0,1 um:zero minimum:500 name:BR_INST_EXECUTED : branch instruction executed w/ or w/o program flow change ++event:0x06 counters:0,1 um:zero minimum:500 name:BR_INST_MISS_PRED : branch mispredicted ++event:0x07 counters:0,1 um:zero minimum:500 name:INSN_EXECUTED : instructions executed ++event:0x09 counters:0,1 um:zero minimum:500 name:DCACHE_ACCESS : data cache access, cacheable locations ++event:0x0a counters:0,1 um:zero minimum:500 name:DCACHE_ACCESS_ALL : data cache access, all locations ++event:0x0b counters:0,1 um:zero minimum:500 name:DCACHE_MISS : data cache miss ++event:0x0c counters:0,1 um:zero minimum:500 name:DCACHE_WB : data cache writeback, 1 event for every half cacheline ++event:0x0d counters:0,1 um:zero minimum:500 name:PC_CHANGE : number of times the program counter was changed without a mode switch ++event:0x0f counters:0,1 um:zero minimum:500 name:TLB_MISS : Main TLB miss ++event:0x10 counters:0,1 um:zero minimum:500 name:EXP_EXTERNAL : Explict external data access ++event:0x11 counters:0,1 um:zero minimum:500 name:LSU_STALL : cycles stalled because Load Store request queque is full ++event:0x12 counters:0,1 um:zero minimum:500 name:WRITE_DRAIN : Times write buffer was drained ++event:0x20 counters:0,1 um:zero minimum:500 name:ETMEXTOUT0 : nuber of cycles ETMEXTOUT[0] signal was asserted ++event:0x21 counters:0,1 um:zero minimum:500 name:ETMEXTOUT1 : nuber of cycles ETMEXTOUT[1] signal was asserted ++event:0x22 counters:0,1 um:zero minimum:500 name:ETMEXTOUT_BOTH : nuber of cycles both ETMEXTOUT [0] and [1] were asserted * 2 ++event:0xff counters:0,1,2 um:zero minimum:500 name:CPU_CYCLES : clock cycles counter diff --git a/packages/oprofile/oprofile/fix-arith.patch b/packages/oprofile/oprofile/fix-arith.patch new file mode 100644 index 0000000000..5c55f4b349 --- /dev/null +++ b/packages/oprofile/oprofile/fix-arith.patch @@ -0,0 +1,52 @@ +Index: utils/opcontrol +=================================================================== +RCS file: /cvsroot/oprofile/oprofile/utils/opcontrol,v +retrieving revision 1.148 +diff -u -r1.148 opcontrol +--- utils/opcontrol 8 Nov 2007 09:24:30 -0000 1.148 ++++ utils/opcontrol 27 Nov 2007 17:02:20 -0000 +@@ -395,7 +395,7 @@ + echo "SESSION_DIR=$SESSION_DIR" >>$SETUP_FILE + + if test "$NR_CHOSEN" != "0"; then +- for f in `seq 0 $((NR_CHOSEN - 1))`; do ++ for f in `seq 0 $(($NR_CHOSEN - 1))`; do + get_event $f + echo "CHOSEN_EVENTS_${f}=$GOTEVENT" >>$SETUP_FILE + done +@@ -590,7 +590,7 @@ + OPHELP_ARGS= + + if test "$NR_CHOSEN" != 0; then +- for f in `seq 0 $((NR_CHOSEN - 1))`; do ++ for f in `seq 0 $(($NR_CHOSEN - 1))`; do + get_event $f + if test "$GOTEVENT" != ""; then + OPHELP_ARGS="$OPHELP_ARGS $GOTEVENT" +@@ -612,7 +612,7 @@ + return + fi + +- for f in `seq 0 $((NR_CHOSEN - 1))`; do ++ for f in `seq 0 $(($NR_CHOSEN - 1))`; do + get_event $f + if test "$GOTEVENT" != ""; then + EVENT=`echo $GOTEVENT | awk -F: '{print $1}'` +@@ -1226,7 +1226,7 @@ + verify_counters + + OPROFILED_EVENTS= +- for f in `seq 0 $((NR_CHOSEN - 1))`; do ++ for f in `seq 0 $(($NR_CHOSEN - 1))`; do + get_event $f + if test "$GOTEVENT" != ""; then + EVENT=`echo $GOTEVENT | awk -F: '{print $1}'` +@@ -1383,7 +1383,7 @@ + fi + + if test "$NR_CHOSEN" != "0"; then +- for f in `seq 0 $((NR_CHOSEN - 1))`; do ++ for f in `seq 0 $(($NR_CHOSEN - 1))`; do + get_event $f + echo "Event $f: $GOTEVENT" + done diff --git a/packages/oprofile/oprofile/oparchive_fix.patch b/packages/oprofile/oprofile/oparchive_fix.patch new file mode 100644 index 0000000000..dbdd5eb4ea --- /dev/null +++ b/packages/oprofile/oprofile/oparchive_fix.patch @@ -0,0 +1,22 @@ +Index: oprofile/pp/oparchive.cpp +=================================================================== +--- oprofile.orig/pp/oparchive.cpp ++++ oprofile/pp/oparchive.cpp +@@ -95,7 +95,7 @@ int oparchive(options::spec const & spec + * to avoid overwriting files with the same name. The + * /usr/lib/debug search path is not going to work. + */ +- bfd * ibfd = open_bfd(exe_name); ++ bfd * ibfd = open_bfd(options::archive_path + exe_name); + if (ibfd) { + string global(options::archive_path + DEBUGDIR); + string dirname = op_dirname(options::archive_path + +@@ -106,7 +106,7 @@ int oparchive(options::spec const & spec + /* found something copy it over */ + string dest_debug_dir = options::outdirectory + + dirname + "/.debug/"; +- if (create_dir(dest_debug_dir.c_str())) { ++ if (!options::list_files && create_dir(dest_debug_dir.c_str())) { + cerr << "Unable to create directory: " + << dest_debug_dir << "." << endl; + exit (EXIT_FAILURE); diff --git a/packages/oprofile/oprofile/opstart.patch b/packages/oprofile/oprofile/opstart.patch new file mode 100644 index 0000000000..e8da0922cc --- /dev/null +++ b/packages/oprofile/oprofile/opstart.patch @@ -0,0 +1,235 @@ +Index: oprofile/utils/Makefile.am +=================================================================== +--- oprofile.orig/utils/Makefile.am ++++ oprofile/utils/Makefile.am +@@ -3,8 +3,15 @@ AM_CFLAGS = @OP_CFLAGS@ + + LIBS=@POPT_LIBS@ @LIBERTY_LIBS@ + +-bin_PROGRAMS = ophelp ++bin_PROGRAMS = ophelp opstart + dist_bin_SCRIPTS = opcontrol + + ophelp_SOURCES = ophelp.c + ophelp_LDADD = ../libop/libop.a ../libutil/libutil.a ++ ++opstart_SOURCES = opstart.c ++ ++install-exec-local: ++ cd $(DESTDIR)/$(bindir) && \ ++ rm -f opstop && \ ++ $(LN_S) opstart opstop +Index: oprofile/utils/opstart.c +=================================================================== +--- /dev/null ++++ oprofile/utils/opstart.c +@@ -0,0 +1,110 @@ ++/** ++ * @file opstart.c ++ * Start/Stop oprofile ++ * ++ * @remark Copyright 2007 Openedhand Ltd. ++ * @remark Read the file COPYING ++ * ++ * @author Richard Purdie ++ */ ++ ++#include <signal.h> ++#include <stdio.h> ++#include <stdlib.h> ++#include <string.h> ++#include <unistd.h> ++#include <sys/types.h> ++#include <sys/stat.h> ++ ++int main(const int argc, const char* argv[]) ++{ ++ const char *enable = "/dev/oprofile/enable"; ++ const char *lockfile; ++ unsigned long dpid; ++ struct stat sbuf; ++ FILE *lfile, *efile; ++ int sig, enb, err; ++ ++ if (argc >= 2) { ++ printf("Error: Invalid options.\n"); ++ return 1; ++ } ++ ++ lockfile = getenv("LOCK_FILE"); ++ if (!lockfile) ++ lockfile = "/var/lib/oprofile/lock"; ++ ++ /* Add SESSION_DIR support? */ ++ ++ if (geteuid()) { ++ printf("Error: This program must be run as root.\n"); ++ return 1; ++ } ++ ++ if (stat(enable, &sbuf)) { ++ printf("Error: Could not find /dev/oprofile/enable, the" ++ " kernel module probably isn't loaded.\n"); ++ printf("This binary only works with 2.6 kernels and oprofile" ++ " must have been initialised with 'opcontrol --start-daemon'.\n"); ++ return 1; ++ } ++ ++ if (stat(lockfile, &sbuf)) { ++ printf("Error: Could not find lockfile %s.\n", lockfile); ++ printf("The oprofile daemon must be running (oprofile must" ++ " have been initialised with 'opcontrol --start-daemon').\n"); ++ return 1; ++ } ++ ++ lfile = fopen(lockfile, "r"); ++ if (!lfile) { ++ printf("Error opening lockfile %s.\n", lockfile); ++ return 1; ++ } ++ ++ err = fscanf(lfile, "%lud", (unsigned long *) &dpid); ++ if (err != 1) { ++ printf("Error reading pid from lockfile %s.\n", lockfile); ++ return 1; ++ } ++ fclose(lfile); ++ ++ efile = fopen(enable, "r"); ++ if (!efile) { ++ printf("Error opening %s.\n", enable); ++ return 1; ++ } ++ ++ if (strstr(argv[0], "opstart")) { ++ printf("Starting Profiler\n"); ++ sig = SIGUSR1; ++ enb = 1; ++ } else if (strstr(argv[0], "opstop")) { ++ printf("Stopping Oprofile.\n"); ++ printf("You need to run 'opcontrol --dump' when the session" ++ " is finished.\n"); ++ sig = SIGUSR2; ++ enb = 0; ++ } else { ++ printf("Error: Please call as 'opstart' or 'opstop'\n"); ++ return 1; ++ } ++ ++ err = kill(dpid, 0); ++ if (err) { ++ printf("Error sending signal to oprofiled. Stale lockfile" ++ " (%s) ?\n", lockfile); ++ return 1; ++ } ++ ++ fprintf(efile, "%d\n", enb); ++ err = kill(dpid, sig); ++ if (err) { ++ printf("Error sending signal to oprofiled. Stale lockfile" ++ " (%s) ?\n", lockfile); ++ return 1; ++ } ++ ++ return 0; ++} ++ +Index: oprofile/configure.in +=================================================================== +--- oprofile.orig/configure.in ++++ oprofile/configure.in +@@ -16,6 +16,7 @@ AM_INIT_AUTOMAKE(oprofile, 0.9.4cvs) + AM_CONFIG_HEADER(config.h) + + AC_PROG_RANLIB ++AC_PROG_LN_S + + dnl for the man page + DATE="`date '+%a %d %B %Y'`" +@@ -227,6 +228,8 @@ AC_OUTPUT(Makefile \ + doc/xsl/catalog-1.xml \ + doc/oprofile.1 \ + doc/opcontrol.1 \ ++ doc/opstart.1 \ ++ doc/opstop.1 \ + doc/ophelp.1 \ + doc/opreport.1 \ + doc/opannotate.1 \ +Index: oprofile/doc/Makefile.am +=================================================================== +--- oprofile.orig/doc/Makefile.am ++++ oprofile/doc/Makefile.am +@@ -11,6 +11,8 @@ STYLESHEETS=$(CHUNK_XHTML_STYLESHEET) $( + man_MANS = \ + oprofile.1 \ + opcontrol.1 \ ++ opstart.1 \ ++ opstop.1 \ + opreport.1 \ + opannotate.1 \ + opgprof.1 \ +Index: oprofile/doc/opstart.1.in +=================================================================== +--- /dev/null ++++ oprofile/doc/opstart.1.in +@@ -0,0 +1,27 @@ ++.TH OPSTART 1 "@DATE@" "oprofile @VERSION@" ++.UC 4 ++.SH NAME ++opstart \- start OProfile profiling ++.SH SYNOPSIS ++.br ++.B opstart ++.SH DESCRIPTION ++.B opstart ++is a simple optimised command to start profiling with 2.6 Linux kernels. ++OProfile should have already been initialised by calling "opcontrol --start-daemon". ++ ++.SH ENVIRONMENT ++No special environment variables are recognised by opstart. ++ ++.SH FILES ++.TP ++.I /var/lib/oprofile/samples/ ++The location of the generated sample files. ++ ++.SH VERSION ++.TP ++This man page is current for @PACKAGE@-@VERSION@. ++ ++.SH SEE ALSO ++.BR @OP_DOCDIR@, ++.BR oprofile(1) +Index: oprofile/doc/opstop.1.in +=================================================================== +--- /dev/null ++++ oprofile/doc/opstop.1.in +@@ -0,0 +1,28 @@ ++.TH OPSTOP 1 "@DATE@" "oprofile @VERSION@" ++.UC 4 ++.SH NAME ++opstop \- stop OProfile profiling ++.SH SYNOPSIS ++.br ++.B opstop ++.SH DESCRIPTION ++.B opstop ++is a simple optimsed command to stop profiling with 2.6 Linux kernels. ++You need to run "opcontrol --dump" before being able to view a profile ++with opreport. ++ ++.SH ENVIRONMENT ++No special environment variables are recognised by opstop. ++ ++.SH FILES ++.TP ++.I /var/lib/oprofile/samples/ ++The location of the generated sample files. ++ ++.SH VERSION ++.TP ++This man page is current for @PACKAGE@-@VERSION@. ++ ++.SH SEE ALSO ++.BR @OP_DOCDIR@, ++.BR oprofile(1) diff --git a/packages/oprofile/oprofile/root_option.patch b/packages/oprofile/oprofile/root_option.patch new file mode 100644 index 0000000000..bcb05f6c16 --- /dev/null +++ b/packages/oprofile/oprofile/root_option.patch @@ -0,0 +1,1051 @@ +Index: oprofile/libpp/arrange_profiles.cpp +=================================================================== +--- oprofile.orig/libpp/arrange_profiles.cpp ++++ oprofile/libpp/arrange_profiles.cpp +@@ -798,7 +798,7 @@ get_iprofile(app_map_t & app_map, string + + /// Pull out all the images, removing any we can't access. + void +-verify_and_fill(string archive_path, app_map_t & app_map, ++verify_and_fill(std::vector<std::string> const & archive_paths, app_map_t & app_map, + list<inverted_profile> & plist, extra_images const & extra) + { + app_map_t::iterator it = app_map.begin(); +@@ -807,7 +807,7 @@ verify_and_fill(string archive_path, app + for (; it != end; ++it) { + plist.push_back(it->second); + inverted_profile & ip = plist.back(); +- ip.image = find_image_path(archive_path, ip.image, extra, ++ ip.image = find_image_path(archive_paths, ip.image, extra, + ip.error); + } + } +@@ -816,7 +816,7 @@ verify_and_fill(string archive_path, app + + + list<inverted_profile> const +-invert_profiles(string archive_path, profile_classes const & classes, ++invert_profiles(std::vector<std::string> const & archive_paths, profile_classes const & classes, + extra_images const & extra) + { + app_map_t app_map; +@@ -855,7 +855,7 @@ invert_profiles(string archive_path, pro + + list<inverted_profile> inverted_list; + +- verify_and_fill(archive_path, app_map, inverted_list, extra); ++ verify_and_fill(archive_paths, app_map, inverted_list, extra); + + return inverted_list; + } +Index: oprofile/libpp/arrange_profiles.h +=================================================================== +--- oprofile.orig/libpp/arrange_profiles.h ++++ oprofile/libpp/arrange_profiles.h +@@ -239,7 +239,7 @@ class extra_images; + * applicable (hence image_set). + */ + std::list<inverted_profile> const +-invert_profiles(std::string archive_path, profile_classes const & classes, ++invert_profiles(std::vector<std::string> const & archive_paths, profile_classes const & classes, + extra_images const & extra); + + #endif /* !ARRANGE_PROFILES_H */ +Index: oprofile/libpp/callgraph_container.cpp +=================================================================== +--- oprofile.orig/libpp/callgraph_container.cpp ++++ oprofile/libpp/callgraph_container.cpp +@@ -392,7 +392,7 @@ const symbol_collection & arc_recorder:: + } + + +-void callgraph_container::populate(string const & archive_path, ++void callgraph_container::populate(std::vector<std::string> const & archive_paths, + list<inverted_profile> const & iprofiles, + extra_images const & extra, bool debug_info, double threshold, + bool merge_lib, string_filter const & sym_filter) +@@ -405,7 +405,7 @@ void callgraph_container::populate(strin + list<inverted_profile>::const_iterator const end = iprofiles.end(); + for (it = iprofiles.begin(); it != end; ++it) { + // populate_caller_image take care about empty sample filename +- populate_for_image(archive_path, pc, *it, sym_filter, 0); ++ populate_for_image(archive_paths, pc, *it, sym_filter, 0); + } + + add_symbols(pc); +@@ -414,7 +414,7 @@ void callgraph_container::populate(strin + + for (it = iprofiles.begin(); it != end; ++it) { + for (size_t i = 0; i < it->groups.size(); ++i) { +- populate(archive_path, it->groups[i], it->image, extra, ++ populate(archive_paths, it->groups[i], it->image, extra, + i, pc, debug_info, merge_lib); + } + } +@@ -423,7 +423,7 @@ void callgraph_container::populate(strin + } + + +-void callgraph_container::populate(string const & archive_path, ++void callgraph_container::populate(std::vector<std::string> const & archive_paths, + list<image_set> const & lset, + string const & app_image, extra_images const & extra, size_t pclass, + profile_container const & pc, bool debug_info, bool merge_lib) +@@ -435,14 +435,14 @@ void callgraph_container::populate(strin + list<profile_sample_files>::const_iterator pend + = lit->files.end(); + for (pit = lit->files.begin(); pit != pend; ++pit) { +- populate(archive_path, pit->cg_files, app_image, ++ populate(archive_paths, pit->cg_files, app_image, + extra, pclass, pc, debug_info, merge_lib); + } + } + } + + +-void callgraph_container::populate(string const & archive_path, ++void callgraph_container::populate(std::vector<std::string> const & archive_paths, + list<string> const & cg_files, + string const & app_image, extra_images const & extra, size_t pclass, + profile_container const & pc, bool debug_info, bool merge_lib) +@@ -457,15 +457,15 @@ void callgraph_container::populate(strin + + image_error error; + string caller_binary = +- find_image_path(archive_path, caller_file.lib_image, ++ find_image_path(archive_paths, caller_file.lib_image, + extra, error); + + if (error != image_ok) +- report_image_error(archive_path + caller_file.lib_image, ++ report_image_error(caller_file.lib_image, + error, false); + + bool caller_bfd_ok = true; +- op_bfd caller_bfd(archive_path, caller_binary, ++ op_bfd caller_bfd(archive_paths, caller_binary, + string_filter(), caller_bfd_ok); + if (!caller_bfd_ok) + report_image_error(caller_binary, +@@ -474,13 +474,13 @@ void callgraph_container::populate(strin + parsed_filename callee_file = parse_filename(*it); + + string callee_binary = +- find_image_path(archive_path, callee_file.cg_image, ++ find_image_path(archive_paths, callee_file.cg_image, + extra, error); + if (error != image_ok) + report_image_error(callee_file.cg_image, error, false); + + bool callee_bfd_ok = true; +- op_bfd callee_bfd(archive_path, callee_binary, ++ op_bfd callee_bfd(archive_paths, callee_binary, + string_filter(), callee_bfd_ok); + if (!callee_bfd_ok) + report_image_error(callee_binary, +Index: oprofile/libpp/callgraph_container.h +=================================================================== +--- oprofile.orig/libpp/callgraph_container.h ++++ oprofile/libpp/callgraph_container.h +@@ -105,7 +105,7 @@ class callgraph_container { + public: + /** + * Populate the container, must be called once only. +- * @param archive_path oparchive prefix path ++ * @param archive_paths oparchive prefix paths + * @param iprofiles sample file list including callgraph files. + * @param extra extra image list to fixup binary name. + * @param debug_info true if we must record linenr information +@@ -116,7 +116,7 @@ public: + * Currently all errors core dump. + * FIXME: consider if this should be a ctor + */ +- void populate(std::string const & archive_path, ++ void populate(std::vector<std::string> const & archive_paths, + std::list<inverted_profile> const & iprofiles, + extra_images const & extra, bool debug_info, + double threshold, bool merge_lib, +@@ -149,13 +149,13 @@ private: + profile_container const & pc, bool debug_info, + size_t pclass); + +- void populate(std::string const & archive_path, ++ void populate(std::vector<std::string> const & archive_paths, + std::list<image_set> const & lset, + std::string const & app_image, + extra_images const & extra, size_t pclass, + profile_container const & pc, bool debug_info, + bool merge_lib); +- void populate(std::string const & archive_path, ++ void populate(std::vector<std::string> const & archive_paths, + std::list<std::string> const & cg_files, + std::string const & app_image, + extra_images const & extra, size_t pclass, +Index: oprofile/libpp/locate_images.cpp +=================================================================== +--- oprofile.orig/libpp/locate_images.cpp ++++ oprofile/libpp/locate_images.cpp +@@ -93,14 +93,14 @@ public: + } // anon namespace + + +-string const find_image_path(string const & archive_path, ++string const find_image_path(std::vector<std::string> const & archive_paths, + string const & image_name, + extra_images const & extra_images, + image_error & error) + { + error = image_ok; + +- string const image = op_realpath(archive_path + image_name); ++ string const image = op_realpath(op_findfile(archive_paths, image_name)); + + // simplest case + if (op_file_readable(image)) { +Index: oprofile/libpp/locate_images.h +=================================================================== +--- oprofile.orig/libpp/locate_images.h ++++ oprofile/libpp/locate_images.h +@@ -70,7 +70,7 @@ private: + * If we fail to find the file we fill in error and return the original string. + */ + std::string const +-find_image_path(std::string const & archive_path, ++find_image_path(std::vector<std::string> const & archive_paths, + std::string const & image_name, + extra_images const & extra_images, + image_error & error); +Index: oprofile/libpp/populate.cpp +=================================================================== +--- oprofile.orig/libpp/populate.cpp ++++ oprofile/libpp/populate.cpp +@@ -21,6 +21,7 @@ + #include "populate_for_spu.h" + + #include "image_errors.h" ++#include "file_manip.h" + + #include <iostream> + +@@ -56,16 +57,16 @@ populate_from_files(profile_t & profile, + + + void +-populate_for_image(string const & archive_path, profile_container & samples, ++populate_for_image(std::vector<std::string> const & archive_paths, profile_container & samples, + inverted_profile const & ip, string_filter const & symbol_filter, + bool * has_debug_info) + { + if (is_spu_profile(ip)) +- return populate_for_spu_image(archive_path, samples, ip, ++ return populate_for_spu_image(archive_paths, samples, ip, + symbol_filter, has_debug_info); + + bool ok = ip.error == image_ok; +- op_bfd abfd(archive_path, ip.image, symbol_filter, ok); ++ op_bfd abfd(archive_paths, ip.image, symbol_filter, ok); + if (!ok && ip.error == image_ok) + ip.error = image_format_failure; + +@@ -96,7 +97,7 @@ populate_for_image(string const & archiv + } + + if (found == true && ip.error == image_ok) +- check_mtime(archive_path + abfd.get_filename(), header); ++ check_mtime(op_findfile(archive_paths, abfd.get_filename()), header); + + if (has_debug_info) + *has_debug_info = abfd.has_debug_info(); +Index: oprofile/libpp/populate.h +=================================================================== +--- oprofile.orig/libpp/populate.h ++++ oprofile/libpp/populate.h +@@ -19,7 +19,7 @@ class string_filter; + + /// Load all sample file information for exactly one binary image. + void +-populate_for_image(std::string const & archive_path, ++populate_for_image(std::vector<std::string> const & archive_paths, + profile_container & samples, inverted_profile const & ip, + string_filter const & symbol_filter, bool * has_debug_info); + +Index: oprofile/libpp/populate_for_spu.cpp +=================================================================== +--- oprofile.orig/libpp/populate_for_spu.cpp ++++ oprofile/libpp/populate_for_spu.cpp +@@ -19,6 +19,7 @@ + #include "populate_for_spu.h" + + #include "image_errors.h" ++#include "file_manip.h" + + #include <iostream> + +@@ -46,7 +47,7 @@ static int spu_profile = unknown_profile + void + populate_spu_profile_from_files(list<profile_sample_files> const & files, + string const app_image, +- string const & archive_path, ++ std::vector<std::string> const & archive_paths, + profile_container & samples, + inverted_profile const & ip, + string_filter const & symbol_filter, +@@ -65,14 +66,14 @@ populate_spu_profile_from_files(list<pro + profile.add_sample_file(it->sample_filename); + opd_header header = profile.get_header(); + if (header.embedded_offset) { +- abfd = new op_bfd(archive_path, ++ abfd = new op_bfd(archive_paths, + header.embedded_offset, + ip.image, + symbol_filter, + ok); + fname_to_check = ip.image; + } else { +- abfd = new op_bfd(archive_path, ++ abfd = new op_bfd(archive_paths, + ip.image, + symbol_filter, + ok); +@@ -87,7 +88,7 @@ populate_spu_profile_from_files(list<pro + + samples.add(profile, *abfd, app_image, ip_grp_num); + if (ip.error == image_ok) +- check_mtime(archive_path + fname_to_check, ++ check_mtime(op_findfile(archive_paths, fname_to_check), + profile.get_header()); + + if (has_debug_info && !*has_debug_info) +@@ -98,7 +99,7 @@ populate_spu_profile_from_files(list<pro + } // anon namespace + + void +-populate_for_spu_image(string const & archive_path, ++populate_for_spu_image(std::vector<std::string> const & archive_paths, + profile_container & samples, + inverted_profile const & ip, + string_filter const & symbol_filter, +@@ -113,7 +114,7 @@ populate_for_spu_image(string const & ar + + for (; it != end; ++it) + populate_spu_profile_from_files(it->files, +- it->app_image, archive_path, samples, ip, ++ it->app_image, archive_paths, samples, ip, + symbol_filter, i, has_debug_info); + } + } +Index: oprofile/libpp/populate_for_spu.h +=================================================================== +--- oprofile.orig/libpp/populate_for_spu.h ++++ oprofile/libpp/populate_for_spu.h +@@ -13,6 +13,8 @@ + #ifndef POPULATE_FOR_SPU_H + #define POPULATE_FOR_SPU_H + ++#include <vector> ++ + class profile_container; + class inverted_profile; + class string_filter; +@@ -28,7 +30,7 @@ bool is_spu_profile(inverted_profile con + * This is a special-purpose function for CELL BE SPU profiling. + * See populate_spu_profile_from_files prologue for more details. + */ +-void populate_for_spu_image(std::string const & archive_path, ++void populate_for_spu_image(std::vector<std::string> const & archive_paths, + profile_container & samples, + inverted_profile const & ip, + string_filter const & symbol_filter, +Index: oprofile/libpp/profile_spec.cpp +=================================================================== +--- oprofile.orig/libpp/profile_spec.cpp ++++ oprofile/libpp/profile_spec.cpp +@@ -30,7 +30,7 @@ namespace { + // we should maintain the original to maintain the wordexp etc. + string const fixup_image_spec(string const & str, extra_images const & extra) + { +- string dummy_archive_path; ++ std::vector<std::string> const dummy_archive_path; + // FIXME: what todo if an error in find_image_path() ? + image_error error; + return find_image_path(dummy_archive_path, str, extra, error); +Index: oprofile/libpp/xml_utils.cpp +=================================================================== +--- oprofile.orig/libpp/xml_utils.cpp ++++ oprofile/libpp/xml_utils.cpp +@@ -111,10 +111,10 @@ string get_cpu_num(size_t pclass) + + xml_utils::xml_utils(format_output::xml_formatter * xo, + symbol_collection const & s, size_t nc, +- string_filter * sf, string const & ap) ++ string_filter * sf, std::vector<std::string> const & ap) + : + symbol_filter(sf), +- archive_path(ap), ++ archive_paths(ap), + has_subclasses(false), + bytes_index(0) + { +@@ -379,11 +379,11 @@ xml_utils::output_symbol_bytes(ostream & + string const & image_name = get_image_name(symb->image_name, true); + op_bfd * abfd = NULL; + if (symb->spu_offset) +- abfd = new op_bfd(archive_path, symb->spu_offset, ++ abfd = new op_bfd(archive_paths, symb->spu_offset, + get_image_name(symb->embedding_filename, true), + *symbol_filter, ok); + else +- abfd = new op_bfd(archive_path, image_name, *symbol_filter, ok); ++ abfd = new op_bfd(archive_paths, image_name, *symbol_filter, ok); + if (!ok) { + report_image_error(image_name, image_format_failure, false); + delete abfd; +Index: oprofile/libpp/xml_utils.h +=================================================================== +--- oprofile.orig/libpp/xml_utils.h ++++ oprofile/libpp/xml_utils.h +@@ -22,7 +22,7 @@ class xml_utils { + public: + xml_utils(format_output::xml_formatter * xo, + symbol_collection const & s, size_t nc, +- string_filter * sf, std::string const & ap); ++ string_filter * sf, std::vector<std::string> const & ap); + // these members are static because they are invoked before + // the xml_utils object has been created + static std::string get_timer_setup(size_t count); +@@ -51,7 +51,7 @@ public: + private: + string_filter * symbol_filter; + bool multiple_events; +- std::string archive_path; ++ std::vector<std::string> const & archive_paths; + bool has_subclasses; + size_t bytes_index; + static bool has_nonzero_masks; +Index: oprofile/libutil++/op_bfd.cpp +=================================================================== +--- oprofile.orig/libutil++/op_bfd.cpp ++++ oprofile/libutil++/op_bfd.cpp +@@ -27,6 +27,7 @@ + #include "string_filter.h" + #include "stream_util.h" + #include "cverb.h" ++#include "file_manip.h" + + using namespace std; + +@@ -87,11 +88,11 @@ bool op_bfd_symbol::operator<(op_bfd_sym + } + + +-op_bfd::op_bfd(string const & archive, string const & fname, ++op_bfd::op_bfd(std::vector<std::string> const & archive, string const & fname, + string_filter const & symbol_filter, bool & ok) + : + filename(fname), +- archive_path(archive), ++ archive_paths(archive), + file_size(-1) + { + int fd; +@@ -102,7 +103,7 @@ op_bfd::op_bfd(string const & archive, s + symbols_found_t symbols; + asection const * sect; + +- string const image_path = archive_path + filename; ++ string const image_path = op_findfile(archive_paths, filename); + + cverb << vbfd << "op_bfd ctor for " << image_pat |
