From 0eb52ff8cc719b22cecf0b2e333ae13fbf9293cd Mon Sep 17 00:00:00 2001
From: nealsid <nealsid@4c0a9323-5329-0410-9bdc-e9ce6186880e>
Date: Fri, 5 Jun 2009 22:40:28 +0000
Subject: Use ctsdio streams for dump_syms for significant speedup.  Also
 contains a makefile fix to build in 32-bit mode, even on 64-bit systems.

A=jim blandy
R=nealsid



git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@347 4c0a9323-5329-0410-9bdc-e9ce6186880e
---
 src/common/linux/dump_symbols.cc       | 60 ++++++++++++++--------------------
 src/common/linux/dump_symbols.h        |  3 +-
 src/tools/linux/dump_syms/Makefile     |  2 +-
 src/tools/linux/dump_syms/dump_syms.cc |  2 +-
 4 files changed, 28 insertions(+), 39 deletions(-)

(limited to 'src')

diff --git a/src/common/linux/dump_symbols.cc b/src/common/linux/dump_symbols.cc
index fd87c0f0..046c7b34 100644
--- a/src/common/linux/dump_symbols.cc
+++ b/src/common/linux/dump_symbols.cc
@@ -169,18 +169,6 @@ static ElfW(Addr) GetLoadingAddress(const ElfW(Phdr) *program_headers,
   return 0;
 }
 
-static bool WriteFormat(int fd, const char *fmt, ...) {
-  va_list list;
-  char buffer[4096];
-  ssize_t expected, written;
-  va_start(list, fmt);
-  vsnprintf(buffer, sizeof(buffer), fmt, list);
-  expected = strlen(buffer);
-  written = write(fd, buffer, strlen(buffer));
-  va_end(list);
-  return expected == written;
-}
-
 static bool IsValidElf(const ElfW(Ehdr) *elf_header) {
   return memcmp(elf_header, ELFMAG, SELFMAG) == 0;
 }
@@ -593,7 +581,7 @@ static bool LoadSymbols(ElfW(Ehdr) *elf_header, struct SymbolInfo *symbols) {
   return LoadSymbols(stab_section, stabstr_section, loading_addr, symbols);
 }
 
-static bool WriteModuleInfo(int fd,
+static bool WriteModuleInfo(FILE *file,
                             ElfW(Half) arch,
                             const std::string &obj_file) {
   const char *arch_name = NULL;
@@ -622,26 +610,26 @@ static bool WriteModuleInfo(int fd,
     size_t slash_pos = obj_file.find_last_of("/");
     if (slash_pos != std::string::npos)
       filename = obj_file.substr(slash_pos + 1);
-    return WriteFormat(fd, "MODULE Linux %s %s %s\n", arch_name,
-                       id_no_dash, filename.c_str());
+    return 0 <= fprintf(file, "MODULE Linux %s %s %s\n", arch_name,
+                        id_no_dash, filename.c_str());
   }
   return false;
 }
 
-static bool WriteSourceFileInfo(int fd, const struct SymbolInfo &symbols) {
+static bool WriteSourceFileInfo(FILE *file, const struct SymbolInfo &symbols) {
   for (SourceFileInfoList::const_iterator it =
 	 symbols.source_file_info.begin();
        it != symbols.source_file_info.end(); it++) {
     if (it->source_id != -1) {
       const char *name = it->name;
-      if (!WriteFormat(fd, "FILE %d %s\n", it->source_id, name))
+      if (0 > fprintf(file, "FILE %d %s\n", it->source_id, name))
         return false;
     }
   }
   return true;
 }
 
-static bool WriteOneFunction(int fd,
+static bool WriteOneFunction(FILE *file,
                              const struct FuncInfo &func_info){
   // Discard the ending part of the name.
   std::string func_name(func_info.name);
@@ -653,19 +641,19 @@ static bool WriteOneFunction(int fd,
   if (func_info.size <= 0)
     return true;
 
-  if (WriteFormat(fd, "FUNC %lx %lx %d %s\n",
-                  func_info.rva_to_base,
-                  func_info.size,
-                  func_info.stack_param_size,
-                  func_name.c_str())) {
+  if (0 <= fprintf(file, "FUNC %lx %lx %d %s\n",
+                   (unsigned long) func_info.rva_to_base,
+                   (unsigned long) func_info.size,
+                   func_info.stack_param_size,
+                   func_name.c_str())) {
     for (LineInfoList::const_iterator it = func_info.line_info.begin();
 	 it != func_info.line_info.end(); it++) {
       const struct LineInfo &line_info = *it;
-      if (!WriteFormat(fd, "%lx %lx %d %d\n",
-                       line_info.rva_to_base,
-                       line_info.size,
-                       line_info.line_num,
-                       line_info.source_id))
+      if (0 > fprintf(file, "%lx %lx %d %d\n",
+                      (unsigned long) line_info.rva_to_base,
+                      (unsigned long) line_info.size,
+                      line_info.line_num,
+                      line_info.source_id))
         return false;
     }
     return true;
@@ -673,7 +661,7 @@ static bool WriteOneFunction(int fd,
   return false;
 }
 
-static bool WriteFunctionInfo(int fd, const struct SymbolInfo &symbols) {
+static bool WriteFunctionInfo(FILE *file, const struct SymbolInfo &symbols) {
   for (SourceFileInfoList::const_iterator it =
 	 symbols.source_file_info.begin();
        it != symbols.source_file_info.end(); it++) {
@@ -681,16 +669,16 @@ static bool WriteFunctionInfo(int fd, const struct SymbolInfo &symbols) {
     for (FuncInfoList::const_iterator fiIt = file_info.func_info.begin(); 
 	 fiIt != file_info.func_info.end(); fiIt++) {
       const struct FuncInfo &func_info = *fiIt;
-      if (!WriteOneFunction(fd, func_info))
+      if (!WriteOneFunction(file, func_info))
         return false;
     }
   }
   return true;
 }
 
-static bool DumpStabSymbols(int fd, const struct SymbolInfo &symbols) {
-  return WriteSourceFileInfo(fd, symbols) &&
-    WriteFunctionInfo(fd, symbols);
+static bool DumpStabSymbols(FILE *file, const struct SymbolInfo &symbols) {
+  return WriteSourceFileInfo(file, symbols) &&
+    WriteFunctionInfo(file, symbols);
 }
 
 //
@@ -750,7 +738,7 @@ class MmapWrapper {
 namespace google_breakpad {
 
 bool DumpSymbols::WriteSymbolFile(const std::string &obj_file,
-                                  int sym_fd) {
+                                  FILE *sym_file) {
   int obj_fd = open(obj_file.c_str(), O_RDONLY);
   if (obj_fd < 0)
     return false;
@@ -772,8 +760,8 @@ bool DumpSymbols::WriteSymbolFile(const std::string &obj_file,
   if (!LoadSymbols(elf_header, &symbols))
      return false;
   // Write to symbol file.
-  if (WriteModuleInfo(sym_fd, elf_header->e_machine, obj_file) &&
-      DumpStabSymbols(sym_fd, symbols))
+  if (WriteModuleInfo(sym_file, elf_header->e_machine, obj_file) &&
+      DumpStabSymbols(sym_file, symbols))
     return true;
 
   return false;
diff --git a/src/common/linux/dump_symbols.h b/src/common/linux/dump_symbols.h
index 64f4c9e6..03e61709 100644
--- a/src/common/linux/dump_symbols.h
+++ b/src/common/linux/dump_symbols.h
@@ -34,13 +34,14 @@
 #define COMMON_LINUX_DUMP_SYMBOLS_H__
 
 #include <string>
+#include <cstdio>
 
 namespace google_breakpad {
 
 class DumpSymbols {
  public:
   bool WriteSymbolFile(const std::string &obj_file,
-                       int sym_fd);
+                       FILE *sym_file);
 };
 
 }  // namespace google_breakpad
diff --git a/src/tools/linux/dump_syms/Makefile b/src/tools/linux/dump_syms/Makefile
index 7d74abad..ce60a42b 100644
--- a/src/tools/linux/dump_syms/Makefile
+++ b/src/tools/linux/dump_syms/Makefile
@@ -1,7 +1,7 @@
 CXX=g++
 CC=gcc
 
-CXXFLAGS=-gstabs -I../../.. -DNDEBUG -Wall -D_REENTRANT
+CXXFLAGS=-gstabs -I../../.. -DNDEBUG -Wall -D_REENTRANT -m32
 
 .PHONY:all clean
 
diff --git a/src/tools/linux/dump_syms/dump_syms.cc b/src/tools/linux/dump_syms/dump_syms.cc
index e7eb0a2d..f75abef8 100644
--- a/src/tools/linux/dump_syms/dump_syms.cc
+++ b/src/tools/linux/dump_syms/dump_syms.cc
@@ -43,7 +43,7 @@ int main(int argc, char **argv) {
   const char *binary = argv[1];
 
   DumpSymbols dumper;
-  if (!dumper.WriteSymbolFile(binary, fileno(stdout))) {
+  if (!dumper.WriteSymbolFile(binary, stdout)) {
     fprintf(stderr, "Failed to write symbol file.\n");
     return 1;
   }
-- 
cgit v1.2.1