authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-04 00:32:49+01:00
committergravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2023-11-04 09:13:34+01:00
logee66137269ee5375d7a3ca030ad0989f5edc625f
tree9688092d961437bd35f2d8309590f94a97bb8a06
parente3b82eaa661bc964f62a9481ac9ebfe35cf3bb87

elf: add link smoke tests covering emitting obj and static lib


1 files changed, 68 insertions(+), 0 deletions(-)

test/link/elf.zig+68
...@@ -23,6 +23,8 @@ pub fn build(b: *Build) void {...@@ -23,6 +23,8 @@ pub fn build(b: *Build) void {
2323
24 // Exercise linker with self-hosted backend (no LLVM)24 // Exercise linker with self-hosted backend (no LLVM)
25 elf_step.dependOn(testGcSectionsZig(b, .{ .use_llvm = false, .target = default_target }));25 elf_step.dependOn(testGcSectionsZig(b, .{ .use_llvm = false, .target = default_target }));
26 elf_step.dependOn(testLinkingObj(b, .{ .use_llvm = false, .target = default_target }));
27 elf_step.dependOn(testLinkingStaticLib(b, .{ .use_llvm = false, .target = default_target }));
26 elf_step.dependOn(testLinkingZig(b, .{ .use_llvm = false, .target = default_target }));28 elf_step.dependOn(testLinkingZig(b, .{ .use_llvm = false, .target = default_target }));
27 elf_step.dependOn(testImportingDataDynamic(b, .{ .use_llvm = false, .target = glibc_target }));29 elf_step.dependOn(testImportingDataDynamic(b, .{ .use_llvm = false, .target = glibc_target }));
28 elf_step.dependOn(testImportingDataStatic(b, .{ .use_llvm = false, .target = musl_target }));30 elf_step.dependOn(testImportingDataStatic(b, .{ .use_llvm = false, .target = musl_target }));
...@@ -1823,6 +1825,72 @@ fn testLinkingCpp(b: *Build, opts: Options) *Step {...@@ -1823,6 +1825,72 @@ fn testLinkingCpp(b: *Build, opts: Options) *Step {
1823 return test_step;1825 return test_step;
1824}1826}
18251827
1828fn testLinkingObj(b: *Build, opts: Options) *Step {
1829 const test_step = addTestStep(b, "linking-obj", opts);
1830
1831 const obj = addObject(b, "aobj", opts);
1832 addZigSourceBytes(obj,
1833 \\extern var mod: usize;
1834 \\export fn callMe() usize {
1835 \\ return me * mod;
1836 \\}
1837 \\var me: usize = 42;
1838 );
1839
1840 const exe = addExecutable(b, "testobj", opts);
1841 addZigSourceBytes(exe,
1842 \\const std = @import("std");
1843 \\extern fn callMe() usize;
1844 \\export var mod: usize = 2;
1845 \\pub fn main() void {
1846 \\ std.debug.print("{d}\n", .{callMe()});
1847 \\}
1848 );
1849 exe.addObject(obj);
1850
1851 const run = addRunArtifact(exe);
1852 run.expectStdErrEqual("84\n");
1853 test_step.dependOn(&run.step);
1854
1855 return test_step;
1856}
1857
1858fn testLinkingStaticLib(b: *Build, opts: Options) *Step {
1859 const test_step = addTestStep(b, "linking-static-lib", opts);
1860
1861 const lib = b.addStaticLibrary(.{
1862 .name = "alib",
1863 .target = opts.target,
1864 .optimize = opts.optimize,
1865 .use_llvm = opts.use_llvm,
1866 .use_lld = false,
1867 });
1868 addZigSourceBytes(lib,
1869 \\extern var mod: usize;
1870 \\export fn callMe() usize {
1871 \\ return me * mod;
1872 \\}
1873 \\var me: usize = 42;
1874 );
1875
1876 const exe = addExecutable(b, "testlib", opts);
1877 addZigSourceBytes(exe,
1878 \\const std = @import("std");
1879 \\extern fn callMe() usize;
1880 \\export var mod: usize = 2;
1881 \\pub fn main() void {
1882 \\ std.debug.print("{d}\n", .{callMe()});
1883 \\}
1884 );
1885 exe.linkLibrary(lib);
1886
1887 const run = addRunArtifact(exe);
1888 run.expectStdErrEqual("84\n");
1889 test_step.dependOn(&run.step);
1890
1891 return test_step;
1892}
1893
1826fn testLinkingZig(b: *Build, opts: Options) *Step {1894fn testLinkingZig(b: *Build, opts: Options) *Step {
1827 const test_step = addTestStep(b, "linking-zig-static", opts);1895 const test_step = addTestStep(b, "linking-zig-static", opts);
18281896