| ... | @@ -779,6 +779,7 @@ pub const Object = struct { | ... | @@ -779,6 +779,7 @@ pub const Object = struct { |
| 779 | debug_enums: std.ArrayListUnmanaged(Builder.Metadata), | 779 | debug_enums: std.ArrayListUnmanaged(Builder.Metadata), |
| 780 | debug_globals: std.ArrayListUnmanaged(Builder.Metadata), | 780 | debug_globals: std.ArrayListUnmanaged(Builder.Metadata), |
| 781 | | 781 | |
| | 782 | debug_file_map: std.AutoHashMapUnmanaged(*const Module.File, Builder.Metadata), |
| 782 | debug_type_map: std.AutoHashMapUnmanaged(Type, Builder.Metadata), | 783 | debug_type_map: std.AutoHashMapUnmanaged(Type, Builder.Metadata), |
| 783 | | 784 | |
| 784 | debug_unresolved_namespace_scopes: std.AutoArrayHashMapUnmanaged(InternPool.NamespaceIndex, Builder.Metadata), | 785 | debug_unresolved_namespace_scopes: std.AutoArrayHashMapUnmanaged(InternPool.NamespaceIndex, Builder.Metadata), |
| ... | @@ -961,6 +962,7 @@ pub const Object = struct { | ... | @@ -961,6 +962,7 @@ pub const Object = struct { |
| 961 | .debug_globals_fwd_ref = debug_globals_fwd_ref, | 962 | .debug_globals_fwd_ref = debug_globals_fwd_ref, |
| 962 | .debug_enums = .{}, | 963 | .debug_enums = .{}, |
| 963 | .debug_globals = .{}, | 964 | .debug_globals = .{}, |
| | 965 | .debug_file_map = .{}, |
| 964 | .debug_type_map = .{}, | 966 | .debug_type_map = .{}, |
| 965 | .debug_unresolved_namespace_scopes = .{}, | 967 | .debug_unresolved_namespace_scopes = .{}, |
| 966 | .target = target, | 968 | .target = target, |
| ... | @@ -978,8 +980,9 @@ pub const Object = struct { | ... | @@ -978,8 +980,9 @@ pub const Object = struct { |
| 978 | | 980 | |
| 979 | pub fn deinit(self: *Object) void { | 981 | pub fn deinit(self: *Object) void { |
| 980 | const gpa = self.gpa; | 982 | const gpa = self.gpa; |
| 981 | self.debug_globals.deinit(gpa); | | |
| 982 | self.debug_enums.deinit(gpa); | 983 | self.debug_enums.deinit(gpa); |
| | 984 | self.debug_globals.deinit(gpa); |
| | 985 | self.debug_file_map.deinit(gpa); |
| 983 | self.debug_type_map.deinit(gpa); | 986 | self.debug_type_map.deinit(gpa); |
| 984 | self.debug_unresolved_namespace_scopes.deinit(gpa); | 987 | self.debug_unresolved_namespace_scopes.deinit(gpa); |
| 985 | self.decl_map.deinit(gpa); | 988 | self.decl_map.deinit(gpa); |
| ... | @@ -1922,10 +1925,25 @@ pub const Object = struct { | ... | @@ -1922,10 +1925,25 @@ pub const Object = struct { |
| 1922 | } | 1925 | } |
| 1923 | | 1926 | |
| 1924 | fn getDebugFile(o: *Object, file: *const Module.File) Allocator.Error!Builder.Metadata { | 1927 | fn getDebugFile(o: *Object, file: *const Module.File) Allocator.Error!Builder.Metadata { |
| 1925 | return try o.builder.debugFile( | 1928 | const gpa = o.gpa; |
| | 1929 | const gop = try o.debug_file_map.getOrPut(gpa, file); |
| | 1930 | errdefer assert(o.debug_file_map.remove(file)); |
| | 1931 | if (gop.found_existing) return gop.value_ptr.*; |
| | 1932 | gop.value_ptr.* = try o.builder.debugFile( |
| 1926 | try o.builder.metadataString(std.fs.path.basename(file.sub_file_path)), | 1933 | try o.builder.metadataString(std.fs.path.basename(file.sub_file_path)), |
| 1927 | if (std.fs.path.dirname(file.sub_file_path)) |dirname| try o.builder.metadataString(dirname) else .none, | 1934 | dir_path: { |
| | 1935 | const sub_path = std.fs.path.dirname(file.sub_file_path) orelse ""; |
| | 1936 | const dir_path = try file.mod.root.joinString(gpa, sub_path); |
| | 1937 | defer gpa.free(dir_path); |
| | 1938 | if (std.fs.path.isAbsolute(dir_path)) |
| | 1939 | break :dir_path try o.builder.metadataString(dir_path); |
| | 1940 | var abs_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; |
| | 1941 | const abs_path = std.fs.realpath(dir_path, &abs_buffer) catch |
| | 1942 | break :dir_path try o.builder.metadataString(dir_path); |
| | 1943 | break :dir_path try o.builder.metadataString(abs_path); |
| | 1944 | }, |
| 1928 | ); | 1945 | ); |
| | 1946 | return gop.value_ptr.*; |
| 1929 | } | 1947 | } |
| 1930 | | 1948 | |
| 1931 | pub fn lowerDebugType( | 1949 | pub fn lowerDebugType( |