From 1a7deb6089a440877b852c137eb5c71f627d407f Mon Sep 17 00:00:00 2001 From: Angie Date: Thu, 25 Apr 2024 09:47:38 -0400 Subject: [PATCH] Functions to write the partial scripts #20 --- slinky-cli/src/main.rs | 8 +++++-- slinky/src/partial_linker_writer.rs | 34 ++++++++++++++++++++++++----- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/slinky-cli/src/main.rs b/slinky-cli/src/main.rs index 65d3e52..9090e12 100644 --- a/slinky-cli/src/main.rs +++ b/slinky-cli/src/main.rs @@ -36,8 +36,12 @@ fn main() { writer.add_all_segment(&document.segments); - let output_path = cli.output.expect("output path is required for partial linking"); - writer.save_linker_scripts(&output_path).expect("Error writing the linker scripts"); + let output_path = cli + .output + .expect("output path is required for partial linking"); + writer + .save_linker_scripts(&output_path) + .expect("Error writing the linker scripts"); writer .write_other_files() .expect("Error writing other files listed on the document"); diff --git a/slinky/src/partial_linker_writer.rs b/slinky/src/partial_linker_writer.rs index aa5f288..5821696 100644 --- a/slinky/src/partial_linker_writer.rs +++ b/slinky/src/partial_linker_writer.rs @@ -1,13 +1,17 @@ /* SPDX-FileCopyrightText: © 2024 decompals */ /* SPDX-License-Identifier: MIT */ -use std::{collections::HashMap, path::{Path, PathBuf}}; +use std::{ + collections::HashMap, + path::{Path, PathBuf}, +}; use crate::{FileInfo, FileKind, LinkerWriter, Segment, Settings, SlinkyError}; pub struct PartialLinkerWriter<'a> { main_writer: LinkerWriter<'a>, - partial_writers: Vec>, + + partial_writers: Vec<(LinkerWriter<'a>, String)>, settings: &'a Settings, } @@ -16,6 +20,7 @@ impl<'a> PartialLinkerWriter<'a> { pub fn new(settings: &'a Settings) -> Self { Self { main_writer: LinkerWriter::new(settings), + partial_writers: Vec::new(), settings, @@ -25,12 +30,14 @@ impl<'a> PartialLinkerWriter<'a> { pub fn add_all_segment(&mut self, segments: &[Segment]) { self.main_writer.begin_sections(); + self.partial_writers.reserve(segments.len()); for segment in segments { let mut partial_writer = LinkerWriter::new(self.settings); partial_writer.add_single_segment(segment); - self.partial_writers.push(partial_writer); + self.partial_writers + .push((partial_writer, segment.name.clone())); let mut p = PathBuf::new(); @@ -55,11 +62,28 @@ impl<'a> PartialLinkerWriter<'a> { self.main_writer.end_sections(); } - pub fn save_linker_scripts(&self, _path: &Path) -> Result<(), SlinkyError> { + pub fn save_linker_scripts(&self, path: &Path) -> Result<(), SlinkyError> { + self.main_writer.save_linker_script(path)?; + + for (partial, name) in &self.partial_writers { + let mut p = PathBuf::new(); + + p.push(&self.settings.partial_scripts_path); + p.push(&format!("{}.ld", name)); + + partial.save_linker_script(&p)?; + } + Ok(()) } pub fn write_other_files(&self) -> Result<(), SlinkyError> { + self.main_writer.write_other_files()?; + + for (partial, _name) in &self.partial_writers { + partial.write_other_files()?; + } + Ok(()) } } @@ -72,7 +96,7 @@ impl PartialLinkerWriter<'_> { } #[must_use] - pub fn get_partial_writers(&self) -> &Vec { + pub fn get_partial_writers(&self) -> &Vec<(LinkerWriter, String)> { &self.partial_writers } }