| Index: native_client_sdk/src/libraries/xray/xray.c
|
| ===================================================================
|
| --- native_client_sdk/src/libraries/xray/xray.c (revision 208986)
|
| +++ native_client_sdk/src/libraries/xray/xray.c (working copy)
|
| @@ -19,9 +19,20 @@
|
|
|
| #if defined(XRAY)
|
|
|
| -#define RDTSC(_x) __asm__ __volatile__ ("rdtsc" : "=A" (_x));
|
| #define FORCE_INLINE __attribute__((always_inline))
|
|
|
| +#if defined(__amd64__)
|
| +FORCE_INLINE uint64_t RDTSC64() {
|
| + uint64_t a, d;
|
| + __asm__ __volatile__("rdtsc" : "=a" (a), "=d" (d));
|
| + return ((uint64_t)a) | (((uint64_t)d) << 32);
|
| +}
|
| +#define RDTSC(_x) _x = RDTSC64()
|
| +#else
|
| +#define RDTSC(_x) __asm__ __volatile__ ("rdtsc" : "=A" (_x));
|
| +#endif
|
| +
|
| +
|
| /* Use a TLS variable for cheap thread uid. */
|
| volatile __thread int g_xray_thread_id;
|
|
|
| @@ -591,12 +602,12 @@
|
|
|
|
|
| /* Dumps the trace report for a given frame. */
|
| -void XRayTraceReport(FILE* f, int frame, char* label, float cutoff) {
|
| +void XRayTraceReport(FILE* f, int frame, char* label,
|
| + float percent_cutoff, int ticks_cutoff) {
|
| int index;
|
| int start;
|
| int end;
|
| float total;
|
| - int bad_depth = 0;
|
| char space[257];
|
| memset(space, ' ', 256);
|
| space[256] = 0;
|
| @@ -626,8 +637,7 @@
|
| uint32_t ticks = (e->ticks);
|
| uint32_t annotation_index = (e->annotation_index);
|
| float percent = 100.0f * (float)ticks / total;
|
| - if (percent >= cutoff) {
|
| - if (depth > 250) bad_depth++;
|
| + if (percent >= percent_cutoff && ticks >= ticks_cutoff) {
|
| struct XRaySymbol* symbol;
|
| symbol = XRaySymbolTableLookup(g_xray.symbols, addr);
|
| symbol_name = XRaySymbolGetName(symbol);
|
| @@ -724,11 +734,12 @@
|
|
|
|
|
| /* Dump a frame report followed by trace report(s) for each frame. */
|
| -void XRayReport(FILE* f, float cutoff) {
|
| +void XRayReport(FILE* f, float percent_cutoff, int ticks_cutoff) {
|
| int head;
|
| int index;
|
| int counter = 0;
|
| - fprintf(f, "Number of symbols: %d\n", XRaySymbolCount(g_xray.symbols));
|
| + if (g_xray.symbols)
|
| + fprintf(f, "Number of symbols: %d\n", XRaySymbolCount(g_xray.symbols));
|
| XRayFrameReport(f);
|
| fprintf(f, "\n");
|
| head = g_xray.frame.head;
|
| @@ -737,8 +748,9 @@
|
| char label[XRAY_MAX_LABEL];
|
| fprintf(f, "\n");
|
| XRayFrameMakeLabel(counter, label);
|
| - XRayTraceReport(f, index, label, cutoff);
|
| + XRayTraceReport(f, index, label, percent_cutoff, ticks_cutoff);
|
| index = XRayFrameNext(index);
|
| +
|
| ++counter;
|
| }
|
| fprintf(f,
|
| @@ -746,15 +758,18 @@
|
| #if defined(XRAY_OUTPUT_HASH_COLLISIONS)
|
| XRayHashTableHisto(f);
|
| #endif
|
| + fflush(f);
|
| }
|
|
|
|
|
| /* Write a profile report to text file. */
|
| -void XRaySaveReport(const char* filename, float cutoff) {
|
| +void XRaySaveReport(const char* filename,
|
| + float percent_cutoff,
|
| + int ticks_cutoff) {
|
| FILE* f;
|
| f = fopen(filename, "wt");
|
| if (NULL != f) {
|
| - XRayReport(f, cutoff);
|
| + XRayReport(f, percent_cutoff, ticks_cutoff);
|
| fclose(f);
|
| }
|
| }
|
| @@ -788,10 +803,9 @@
|
| XRayReset();
|
|
|
| /* Mapfile is optional; we don't need it for captures, only for reports. */
|
| - if (NULL != mapfilename) {
|
| - g_xray.symbols = XRaySymbolTableCreate(XRAY_DEFAULT_SYMBOL_TABLE_SIZE);
|
| + g_xray.symbols = XRaySymbolTableCreate(XRAY_DEFAULT_SYMBOL_TABLE_SIZE);
|
| + if (NULL != mapfilename)
|
| XRaySymbolTableParseMapfile(g_xray.symbols, mapfilename);
|
| - }
|
| }
|
|
|
|
|
|
|