pub mod format;
pub mod write;
use crate::args::{LinkOptions, OutputKind};
use crate::diag::DiagnosticSink;
use crate::error::{Error, Result};
use crate::target::{Architecture, BinaryFormat, Endianness, PointerWidth};
pub const FORMAT_NAME: &str = "amigahunk";
#[must_use]
pub fn wanted(options: &LinkOptions) -> bool {
options
.target
.is_some_and(|target| target.format == BinaryFormat::Hunk)
|| options
.output_format
.as_ref()
.is_some_and(|format| format.name() == FORMAT_NAME)
}
pub fn link(options: &LinkOptions, diagnostics: &dyn DiagnosticSink) -> Result<()> {
let mut options = options.clone();
match options.kind {
OutputKind::Executable | OutputKind::StaticExecutable => {
options.kind = OutputKind::StaticExecutable;
}
OutputKind::Relocatable => {
return Err(Error::Unimplemented(
"relocatable AmigaOS Hunk output (-r): HUNK_UNIT objects are not written yet"
.into(),
));
}
kind => {
return Err(Error::Unimplemented(format!(
"{kind:?} output in the AmigaOS Hunk format, which has no dynamic linking"
)));
}
}
let target = options.target.get_or_insert(crate::target::Target {
format: BinaryFormat::Hunk,
arch: Architecture::M68k,
endian: Endianness::Big,
pointer_width: PointerWidth::Bits32,
os: crate::target::OperatingSystem::None,
});
if target.arch != Architecture::M68k {
return Err(Error::Unimplemented(format!(
"AmigaOS Hunk output for {:?}: the format is m68k's",
target.arch
)));
}
target.endian = Endianness::Big;
target.pointer_width = PointerWidth::Bits32;
crate::elf::link(&options, diagnostics)
}