def testSymbolsAtOffsetInexectMatch(self): symbol_infos = [SimpleTestSymbol('1', 0x10, 0x13)] generator = cyglog_to_orderfile.OffsetOrderfileGenerator( test_utils.TestSymbolOffsetProcessor(symbol_infos), None) syms = generator._SymbolsAtOffset(0x11) self.assertEquals(1, len(syms)) self.assertEquals(symbol_infos[0], syms[0])
def testOutputOrderfile(self): # One symbol not matched, one with an odd address, one regularly matched # And two symbols aliased to the same address symbols = [SimpleTestSymbol('Symbol', 0x10, 0x100), SimpleTestSymbol('Symbol2', 0x12, 0x100), SimpleTestSymbol('Symbol3', 0x16, 0x100), SimpleTestSymbol('Symbol3.2', 0x16, 0x0)] generator = cyglog_to_orderfile.OffsetOrderfileGenerator( test_utils.TestSymbolOffsetProcessor(symbols), TestObjectFileProcessor({ 'Symbol': ['.text.Symbol'], 'Symbol2': ['.text.Symbol2', '.text.hot.Symbol2'], 'Symbol3': ['.text.Symbol3'], 'Symbol3.2': ['.text.Symbol3.2']})) ordered_sections = generator.GetOrderedSections([0x12, 0x17]) self.assertListEqual( ['.text.Symbol2', '.text.hot.Symbol2', '.text.Symbol3', '.text.Symbol3.2'], ordered_sections)
def Generate(self): """Generates and maybe upload an order.""" profile_uploaded = False orderfile_uploaded = False assert (bool(self._options.profile) ^ bool(self._options.manual_symbol_offsets)) if self._options.profile: try: _UnstashOutputDirectory(self._instrumented_out_dir) self._compiler = ClankCompiler( self._instrumented_out_dir, self._step_recorder, self._options.arch, self._options.jobs, self._options.max_load, self._options.use_goma, self._options.goma_dir) self._compiler.CompileChromeApk(True) self._GenerateAndProcessProfile() self._MaybeArchiveOrderfile( self._GetUnpatchedOrderfileFilename()) profile_uploaded = True finally: self._DeleteTempFiles() _StashOutputDirectory(self._instrumented_out_dir) elif self._options.manual_symbol_offsets: assert self._options.manual_libname assert self._options.manual_objdir with file(self._options.manual_symbol_offsets) as f: symbol_offsets = [int(x) for x in f.xreadlines()] processor = process_profiles.SymbolOffsetProcessor( self._options.manual_libname) generator = cyglog_to_orderfile.OffsetOrderfileGenerator( processor, cyglog_to_orderfile.ObjectFileProcessor( self._options.manual_objdir)) ordered_sections = generator.GetOrderedSections(symbol_offsets) if not ordered_sections: # Either None or empty is a problem. raise Exception('Failed to get ordered sections') with open(self._GetUnpatchedOrderfileFilename(), 'w') as orderfile: orderfile.write('\n'.join(ordered_sections)) if self._options.patch: if self._options.profile: self._RemoveBlanks(self._GetUnpatchedOrderfileFilename(), self._GetPathToOrderfile()) try: _UnstashOutputDirectory(self._uninstrumented_out_dir) self._compiler = ClankCompiler( self._uninstrumented_out_dir, self._step_recorder, self._options.arch, self._options.jobs, self._options.max_load, self._options.use_goma, self._options.goma_dir) self._compiler.CompileLibchrome(False) self._PatchOrderfile() # Because identical code folding is a bit different with and without # the orderfile build, we need to re-patch the orderfile with code # folding as close to the final version as possible. self._compiler.CompileLibchrome(False, force_relink=True) self._PatchOrderfile() self._compiler.CompileLibchrome(False, force_relink=True) self._VerifySymbolOrder() self._MaybeArchiveOrderfile(self._GetPathToOrderfile()) finally: _StashOutputDirectory(self._uninstrumented_out_dir) orderfile_uploaded = True if (self._options.buildbot and self._options.netrc and not self._step_recorder.ErrorRecorded()): unpatched_orderfile_filename = ( self._GetUnpatchedOrderfileFilename() if profile_uploaded else None) orderfile_filename = (self._GetPathToOrderfile() if orderfile_uploaded else None) self._orderfile_updater.CommitFileHashes( unpatched_orderfile_filename, orderfile_filename) self._step_recorder.EndStep() return not self._step_recorder.ErrorRecorded()
def Generate(self): """Generates and maybe upload an order.""" assert (bool(self._options.profile) ^ bool(self._options.manual_symbol_offsets)) if self._options.system_health_orderfile and not self._options.profile: raise AssertionError('--system_health_orderfile must be not be used ' 'with --skip-profile') if (self._options.manual_symbol_offsets and not self._options.system_health_orderfile): raise AssertionError('--manual-symbol-offsets must be used with ' '--system_health_orderfile.') if self._options.profile: try: _UnstashOutputDirectory(self._instrumented_out_dir) self._compiler = ClankCompiler( self._instrumented_out_dir, self._step_recorder, self._options.arch, self._options.use_goma, self._options.goma_dir, self._options.system_health_orderfile, self._monochrome, self._options.public, self._GetPathToOrderfile()) if not self._options.pregenerated_profiles: # If there are pregenerated profiles, the instrumented build should # not be changed to avoid invalidating the pregenerated profile # offsets. self._compiler.CompileChromeApk(instrumented=True, use_call_graph= self._options.use_call_graph) self._GenerateAndProcessProfile() self._MaybeArchiveOrderfile(self._GetUnpatchedOrderfileFilename()) finally: _StashOutputDirectory(self._instrumented_out_dir) elif self._options.manual_symbol_offsets: assert self._options.manual_libname assert self._options.manual_objdir with file(self._options.manual_symbol_offsets) as f: symbol_offsets = [int(x) for x in f.xreadlines()] processor = process_profiles.SymbolOffsetProcessor( self._compiler.manual_libname) generator = cyglog_to_orderfile.OffsetOrderfileGenerator( processor, cyglog_to_orderfile.ObjectFileProcessor( self._options.manual_objdir)) ordered_sections = generator.GetOrderedSections(symbol_offsets) if not ordered_sections: # Either None or empty is a problem. raise Exception('Failed to get ordered sections') with open(self._GetUnpatchedOrderfileFilename(), 'w') as orderfile: orderfile.write('\n'.join(ordered_sections)) if self._options.patch: if self._options.profile: self._RemoveBlanks(self._GetUnpatchedOrderfileFilename(), self._GetPathToOrderfile()) try: _UnstashOutputDirectory(self._uninstrumented_out_dir) self._compiler = ClankCompiler( self._uninstrumented_out_dir, self._step_recorder, self._options.arch, self._options.use_goma, self._options.goma_dir, self._options.system_health_orderfile, self._monochrome, self._options.public, self._GetPathToOrderfile()) self._compiler.CompileLibchrome(instrumented=False, use_call_graph=False) self._PatchOrderfile() # Because identical code folding is a bit different with and without # the orderfile build, we need to re-patch the orderfile with code # folding as close to the final version as possible. self._compiler.CompileLibchrome(instrumented=False, use_call_graph=False, force_relink=True) self._PatchOrderfile() self._compiler.CompileLibchrome(instrumented=False, use_call_graph=False, force_relink=True) self._VerifySymbolOrder() self._MaybeArchiveOrderfile(self._GetPathToOrderfile()) finally: _StashOutputDirectory(self._uninstrumented_out_dir) if self._options.benchmark: self._output_data['orderfile_benchmark_results'] = self.RunBenchmark( self._uninstrumented_out_dir) self._output_data['no_orderfile_benchmark_results'] = self.RunBenchmark( self._no_orderfile_out_dir, no_orderfile=True) if self._options.buildbot: self._orderfile_updater._GitStash() self._step_recorder.EndStep() return not self._step_recorder.ErrorRecorded()