Skip to content

Commit 69b3fd2

Browse files
author
Ary Borenszweig
committedFeb 10, 2017
Compiler stats: show which modules were not reused. Related to #4015
1 parent 05fa299 commit 69b3fd2

File tree

1 file changed

+20
-11
lines changed

1 file changed

+20
-11
lines changed
 

‎src/compiler/crystal/compiler.cr

+20-11
Original file line numberDiff line numberDiff line change
@@ -267,14 +267,14 @@ module Crystal
267267
object_names = units.map &.object_filename
268268

269269
target_triple = target_machine.triple
270-
reused = 0
270+
reused = [] of String
271271

272272
Crystal.timing("Codegen (bc+obj)", @stats) do
273273
if units.size == 1
274274
first_unit = units.first
275275

276276
codegen_single_unit(program, first_unit, target_triple)
277-
reused += 1 if first_unit.reused_previous_compilation?
277+
reused << first_unit.name if first_unit.reused_previous_compilation?
278278

279279
if emit = @emit
280280
first_unit.emit(emit, emit_base_filename || output_filename)
@@ -297,12 +297,12 @@ module Crystal
297297
end
298298
end
299299

300-
{units.size, reused}
300+
{units, reused}
301301
end
302302

303303
private def codegen_many_units(program, units, target_triple)
304304
jobs_count = 0
305-
reused = 0
305+
reused = [] of String
306306
wait_channel = Channel(Nil).new(@n_threads)
307307

308308
# For stats output we want to count how many previous
@@ -311,8 +311,8 @@ module Crystal
311311
if @stats
312312
pr, pw = IO.pipe
313313
spawn do
314-
pr.each_byte do |byte|
315-
reused += byte
314+
pr.each_line do |line|
315+
reused << line
316316
end
317317
end
318318
end
@@ -325,7 +325,7 @@ module Crystal
325325
slice.each do |unit|
326326
codegen_single_unit(program, unit, target_triple)
327327
if pipe_w && unit.reused_previous_compilation?
328-
pipe_w.write_byte(1_u8)
328+
pipe_w.puts unit.name
329329
end
330330
end
331331
end
@@ -370,16 +370,22 @@ module Crystal
370370
return unless @stats
371371
return unless result
372372

373-
units_size, reused = result
373+
units, reused = result
374374

375375
puts
376376
puts "Codegen (bc+obj):"
377-
if units_size == reused
377+
if units.size == reused.size
378378
puts " - all previous .o files were reused"
379-
elsif reused == 0
379+
elsif reused.size == 0
380380
puts " - no previous .o files were reused"
381381
else
382-
puts " - #{reused}/#{units_size} .o files were reused"
382+
puts " - #{reused.size}/#{units.size} .o files were reused"
383+
not_reused = units.reject { |u| reused.includes?(u.name) }
384+
puts
385+
puts "These modules were not reused:"
386+
not_reused.each do |unit|
387+
puts " - #{unit.original_name} (#{unit.name}.bc)"
388+
end
383389
end
384390
end
385391

@@ -455,12 +461,15 @@ module Crystal
455461
# An LLVM::Module with information to compile it.
456462
class CompilationUnit
457463
getter compiler
464+
getter name
465+
getter original_name
458466
getter llvm_mod
459467
getter? reused_previous_compilation = false
460468

461469
def initialize(@compiler : Compiler, @name : String, @llvm_mod : LLVM::Module,
462470
@output_dir : String, @bc_flags_changed : Bool)
463471
@name = "_main" if @name == ""
472+
@original_name = @name
464473
@name = String.build do |str|
465474
@name.each_char do |char|
466475
case char

0 commit comments

Comments
 (0)
Please sign in to comment.