mirror of
https://github.com/ziglang/zig.git
synced 2026-01-09 08:55:36 +00:00
linker: rename intermediary_basname to zcu_object_sub_path
This commit is contained in:
parent
9b98d33d0b
commit
2d2a18831e
10
src/link.zig
10
src/link.zig
@ -58,7 +58,7 @@ pub const File = struct {
|
||||
file: ?fs.File,
|
||||
/// When linking with LLD, this linker code will output an object file only at
|
||||
/// this location, and then this path can be placed on the LLD linker line.
|
||||
intermediary_basename: ?[]const u8 = null,
|
||||
zcu_object_sub_path: ?[]const u8 = null,
|
||||
disable_lld_caching: bool,
|
||||
gc_sections: bool,
|
||||
print_gc_sections: bool,
|
||||
@ -289,7 +289,7 @@ pub const File = struct {
|
||||
switch (base.tag) {
|
||||
.elf => if (base.file) |f| {
|
||||
if (build_options.only_c) unreachable;
|
||||
if (base.intermediary_basename != null and use_lld) {
|
||||
if (base.zcu_object_sub_path != null and use_lld) {
|
||||
// The file we have open is not the final file that we want to
|
||||
// make executable, so we don't have to close it.
|
||||
return;
|
||||
@ -308,7 +308,7 @@ pub const File = struct {
|
||||
},
|
||||
.coff, .macho, .plan9, .wasm => if (base.file) |f| {
|
||||
if (build_options.only_c) unreachable;
|
||||
if (base.intermediary_basename != null) {
|
||||
if (base.zcu_object_sub_path != null) {
|
||||
// The file we have open is not the final file that we want to
|
||||
// make executable, so we don't have to close it.
|
||||
return;
|
||||
@ -734,7 +734,7 @@ pub const File = struct {
|
||||
try base.flushModule(comp, prog_node);
|
||||
|
||||
const dirname = fs.path.dirname(full_out_path_z) orelse ".";
|
||||
break :blk try fs.path.join(arena, &.{ dirname, base.intermediary_basename.? });
|
||||
break :blk try fs.path.join(arena, &.{ dirname, base.zcu_object_sub_path.? });
|
||||
} else null;
|
||||
|
||||
log.debug("zcu_obj_path={s}", .{if (zcu_obj_path) |s| s else "(null)"});
|
||||
@ -1022,7 +1022,7 @@ pub const File = struct {
|
||||
.pre_bc_path = comp.verbose_llvm_bc,
|
||||
.bin_path = try base.resolveEmitLoc(arena, .{
|
||||
.directory = null,
|
||||
.basename = base.intermediary_basename.?,
|
||||
.basename = base.zcu_object_sub_path.?,
|
||||
}),
|
||||
.asm_path = try base.resolveEmitLoc(arena, comp.emit_asm),
|
||||
.post_ir_path = try base.resolveEmitLoc(arena, comp.emit_llvm_ir),
|
||||
|
||||
@ -3,7 +3,7 @@
|
||||
//! LLD for traditional linking (linking relocatable object files).
|
||||
//! LLD is also the default linker for LLVM.
|
||||
|
||||
/// If this is not null, an object file is created by LLVM and emitted to intermediary_basename.
|
||||
/// If this is not null, an object file is created by LLVM and emitted to zcu_object_sub_path.
|
||||
llvm_object: ?*LlvmObject = null,
|
||||
|
||||
base: link.File,
|
||||
@ -261,7 +261,7 @@ pub fn open(
|
||||
const o_file_path = try std.fmt.allocPrint(arena, "{s}{s}", .{
|
||||
emit.sub_path, target.ofmt.fileExt(target.cpu.arch),
|
||||
});
|
||||
self.base.intermediary_basename = o_file_path;
|
||||
self.base.zcu_object_sub_path = o_file_path;
|
||||
break :p o_file_path;
|
||||
};
|
||||
|
||||
|
||||
@ -35,9 +35,9 @@ pub fn linkWithLLD(self: *Coff, comp: *Compilation, prog_node: *std.Progress.Nod
|
||||
try self.flushModule(comp, prog_node);
|
||||
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, self.base.intermediary_basename.? });
|
||||
break :blk try fs.path.join(arena, &.{ dirname, self.base.zcu_object_sub_path.? });
|
||||
} else {
|
||||
break :blk self.base.intermediary_basename.?;
|
||||
break :blk self.base.zcu_object_sub_path.?;
|
||||
}
|
||||
} else null;
|
||||
|
||||
|
||||
@ -28,7 +28,7 @@ print_map: bool,
|
||||
|
||||
ptr_width: PtrWidth,
|
||||
|
||||
/// If this is not null, an object file is created by LLVM and emitted to intermediary_basename.
|
||||
/// If this is not null, an object file is created by LLVM and emitted to zcu_object_sub_path.
|
||||
llvm_object: ?*LlvmObject = null,
|
||||
|
||||
/// A list of all input files.
|
||||
@ -259,12 +259,25 @@ pub fn createEmpty(
|
||||
else
|
||||
elf.VER_NDX_LOCAL;
|
||||
|
||||
// If using LLD to link, this code should produce an object file so that it
|
||||
// can be passed to LLD.
|
||||
// If using LLVM to generate the object file for the zig compilation unit,
|
||||
// we need a place to put the object file so that it can be subsequently
|
||||
// handled.
|
||||
const zcu_object_sub_path = if (!use_lld and !use_llvm) null else p: {
|
||||
const o_file_path = try std.fmt.allocPrint(arena, "{s}{s}", .{
|
||||
emit.sub_path, target.ofmt.fileExt(target.cpu.arch),
|
||||
});
|
||||
break :p o_file_path;
|
||||
};
|
||||
|
||||
const self = try arena.create(Elf);
|
||||
self.* = .{
|
||||
.base = .{
|
||||
.tag = .elf,
|
||||
.comp = comp,
|
||||
.emit = emit,
|
||||
.zcu_object_sub_path = zcu_object_sub_path,
|
||||
.gc_sections = options.gc_sections orelse (optimize_mode != .Debug and output_mode != .Obj),
|
||||
.print_gc_sections = options.print_gc_sections,
|
||||
.stack_size = options.stack_size orelse 16777216,
|
||||
@ -325,16 +338,10 @@ pub fn createEmpty(
|
||||
const is_obj = output_mode == .Obj;
|
||||
const is_obj_or_ar = is_obj or (output_mode == .Lib and link_mode == .Static);
|
||||
|
||||
const sub_path = if (!use_lld) emit.sub_path else p: {
|
||||
// Open a temporary object file, not the final output file because we
|
||||
// want to link with LLD.
|
||||
const o_file_path = try std.fmt.allocPrint(arena, "{s}{s}", .{
|
||||
emit.sub_path, target.ofmt.fileExt(target.cpu.arch),
|
||||
});
|
||||
self.base.intermediary_basename = o_file_path;
|
||||
break :p o_file_path;
|
||||
};
|
||||
|
||||
// What path should this ELF linker code output to?
|
||||
// If using LLD to link, this code should produce an object file so that it
|
||||
// can be passed to LLD.
|
||||
const sub_path = if (use_lld) zcu_object_sub_path.? else emit.sub_path;
|
||||
self.base.file = try emit.directory.handle.createFile(sub_path, .{
|
||||
.truncate = false,
|
||||
.read = true,
|
||||
@ -1045,7 +1052,7 @@ pub fn flushModule(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node
|
||||
const link_mode = comp.config.link_mode;
|
||||
const directory = self.base.emit.directory; // Just an alias to make it shorter to type.
|
||||
const full_out_path = try directory.join(arena, &[_][]const u8{self.base.emit.sub_path});
|
||||
const module_obj_path: ?[]const u8 = if (self.base.intermediary_basename) |path| blk: {
|
||||
const module_obj_path: ?[]const u8 = if (self.base.zcu_object_sub_path) |path| blk: {
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, path });
|
||||
} else {
|
||||
@ -1613,7 +1620,7 @@ fn dumpArgv(self: *Elf, comp: *Compilation) !void {
|
||||
const link_mode = self.base.comp.config.link_mode;
|
||||
const directory = self.base.emit.directory; // Just an alias to make it shorter to type.
|
||||
const full_out_path = try directory.join(arena, &[_][]const u8{self.base.emit.sub_path});
|
||||
const module_obj_path: ?[]const u8 = if (self.base.intermediary_basename) |path| blk: {
|
||||
const module_obj_path: ?[]const u8 = if (self.base.zcu_object_sub_path) |path| blk: {
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, path });
|
||||
} else {
|
||||
@ -2356,9 +2363,9 @@ fn linkWithLLD(self: *Elf, comp: *Compilation, prog_node: *std.Progress.Node) !v
|
||||
try self.flushModule(comp, prog_node);
|
||||
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, self.base.intermediary_basename.? });
|
||||
break :blk try fs.path.join(arena, &.{ dirname, self.base.zcu_object_sub_path.? });
|
||||
} else {
|
||||
break :blk self.base.intermediary_basename.?;
|
||||
break :blk self.base.zcu_object_sub_path.?;
|
||||
}
|
||||
} else null;
|
||||
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
base: File,
|
||||
|
||||
/// If this is not null, an object file is created by LLVM and emitted to intermediary_basename.
|
||||
/// If this is not null, an object file is created by LLVM and emitted to zcu_object_sub_path.
|
||||
llvm_object: ?*LlvmObject = null,
|
||||
|
||||
/// Debug symbols bundle (or dSym).
|
||||
@ -208,10 +208,10 @@ pub fn open(
|
||||
errdefer self.base.destroy();
|
||||
|
||||
if (mode == .zld) {
|
||||
// TODO this intermediary_basename isn't enough; in the case of `zig build-exe`,
|
||||
// TODO this zcu_object_sub_path isn't enough; in the case of `zig build-exe`,
|
||||
// we also want to put the intermediary object file in the cache while the
|
||||
// main emit directory is the cwd.
|
||||
self.base.intermediary_basename = sub_path;
|
||||
self.base.zcu_object_sub_path = sub_path;
|
||||
return self;
|
||||
}
|
||||
|
||||
|
||||
@ -24,9 +24,9 @@ pub fn linkWithZld(
|
||||
try macho_file.flushModule(comp, prog_node);
|
||||
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, macho_file.base.intermediary_basename.? });
|
||||
break :blk try fs.path.join(arena, &.{ dirname, macho_file.base.zcu_object_sub_path.? });
|
||||
} else {
|
||||
break :blk macho_file.base.intermediary_basename.?;
|
||||
break :blk macho_file.base.zcu_object_sub_path.?;
|
||||
}
|
||||
} else null;
|
||||
|
||||
|
||||
@ -401,7 +401,7 @@ pub fn open(
|
||||
const o_file_path = try std.fmt.allocPrint(arena, "{s}{s}", .{
|
||||
emit.sub_path, target.ofmt.fileExt(target.cpu.arch),
|
||||
});
|
||||
wasm.base.intermediary_basename = o_file_path;
|
||||
wasm.base.zcu_object_sub_path = o_file_path;
|
||||
break :p o_file_path;
|
||||
};
|
||||
|
||||
@ -3511,9 +3511,9 @@ fn linkWithZld(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) l
|
||||
try wasm.flushModule(comp, prog_node);
|
||||
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, wasm.base.intermediary_basename.? });
|
||||
break :blk try fs.path.join(arena, &.{ dirname, wasm.base.zcu_object_sub_path.? });
|
||||
} else {
|
||||
break :blk wasm.base.intermediary_basename.?;
|
||||
break :blk wasm.base.zcu_object_sub_path.?;
|
||||
}
|
||||
} else null;
|
||||
|
||||
@ -4604,9 +4604,9 @@ fn linkWithLLD(wasm: *Wasm, comp: *Compilation, prog_node: *std.Progress.Node) !
|
||||
try wasm.flushModule(comp, prog_node);
|
||||
|
||||
if (fs.path.dirname(full_out_path)) |dirname| {
|
||||
break :blk try fs.path.join(arena, &.{ dirname, wasm.base.intermediary_basename.? });
|
||||
break :blk try fs.path.join(arena, &.{ dirname, wasm.base.zcu_object_sub_path.? });
|
||||
} else {
|
||||
break :blk wasm.base.intermediary_basename.?;
|
||||
break :blk wasm.base.zcu_object_sub_path.?;
|
||||
}
|
||||
} else null;
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user