Allow duplicated methods in different DWARF line tables.

This makes the compilation units more self-contained.
If method is mentioned in the compilation unit, we can
also find its line table there. Otherwise, we would have
to search through all of them.

Change-Id: I0cdfb9006e796e41e123fc1f4fecd15312570068
diff --git a/compiler/debug/elf_debug_line_writer.h b/compiler/debug/elf_debug_line_writer.h
index 11be4e9..9358618 100644
--- a/compiler/debug/elf_debug_line_writer.h
+++ b/compiler/debug/elf_debug_line_writer.h
@@ -18,6 +18,7 @@
 #define ART_COMPILER_DEBUG_ELF_DEBUG_LINE_WRITER_H_
 
 #include <vector>
+#include <unordered_set>
 
 #include "compiled_method.h"
 #include "debug/dwarf/debug_line_opcode_writer.h"
@@ -81,11 +82,14 @@
       case kX86_64:
         break;
     }
+    std::unordered_set<uint64_t> seen_addresses(compilation_unit.methods.size());
     dwarf::DebugLineOpCodeWriter<> opcodes(is64bit, code_factor_bits_);
     for (const MethodDebugInfo* mi : compilation_unit.methods) {
       // Ignore function if we have already generated line table for the same address.
       // It would confuse the debugger and the DWARF specification forbids it.
-      if (mi->deduped) {
+      // We allow the line table for method to be replicated in different compilation unit.
+      // This ensures that each compilation unit contains line table for all its methods.
+      if (!seen_addresses.insert(mi->low_pc).second) {
         continue;
       }