Skip to content
Merged
Changes from 1 commit
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7c75e39
panic_immediate_abort requires abort as a panic strategy
tmiasko Mar 8, 2023
dbe1649
Fix LVI generic load test
raoulstrackx Feb 21, 2023
782e69e
Fix LVI inline assembly test
raoulstrackx Feb 22, 2023
2743dc6
Ignore LVI incompatible assembly tests on sgx platform
raoulstrackx Mar 9, 2023
8428090
Fix run-make LVI tests
raoulstrackx Feb 22, 2023
d69ebf7
Ignore sgx platform for issue-36710
raoulstrackx Mar 9, 2023
05542d9
fix typo in the creation of OpenOption
stlankes Mar 19, 2023
db5dfd2
Add block-based mutex unlocking example
the8472 Mar 14, 2023
a3e41b5
Apply suggestions from code review
the8472 Mar 20, 2023
e600c0b
rustdoc: add support for type filters in arguments and generics
notriddle Mar 1, 2023
cae4385
doc: add generics improvements to rustdoc book
notriddle Mar 3, 2023
485aec4
Add AixLinker to support linking on AIX
Mar 23, 2023
f116110
Fix copy-paste error
Mar 23, 2023
3957d3a
Adjust debug info stripping
Mar 23, 2023
71927ad
resolve: Rename some cstore methods to match queries and add comments
petrochenkov Mar 23, 2023
1cec923
rustc_metadata: Freeze cstore after the full crate list is queried
petrochenkov Mar 23, 2023
e55f73a
Refine error spans for const args in hir typeck
compiler-errors Mar 9, 2023
2bab422
Return nested obligations from canonical response var unification
compiler-errors Mar 22, 2023
6c6bd01
Note type mismatch on ConstArgHasType
compiler-errors Mar 9, 2023
1680334
Use fulfillment in InferCtxt::evaluate_obligation
compiler-errors Mar 23, 2023
eb46afb
Rollup merge of #108629 - notriddle:notriddle/item-type-advanced, r=G…
matthiaskrgr Mar 24, 2023
d9c05b8
Rollup merge of #108924 - tmiasko:panic-immediate-abort, r=thomcc
matthiaskrgr Mar 24, 2023
eb82a5a
Rollup merge of #108961 - compiler-errors:refine-ct-errors, r=BoxyUwU
matthiaskrgr Mar 24, 2023
cfd8105
Rollup merge of #108986 - fortanix:raoul/sync_lvi_patches, r=cuviper
matthiaskrgr Mar 24, 2023
605a4fc
Rollup merge of #109142 - the8472:mutex-block-docs, r=cuviper
matthiaskrgr Mar 24, 2023
cca2630
Rollup merge of #109368 - hermitcore:typo, r=cuviper
matthiaskrgr Mar 24, 2023
1c7ef3b
Rollup merge of #109493 - compiler-errors:new-solver-vars-obligations…
matthiaskrgr Mar 24, 2023
686bd46
Rollup merge of #109515 - bzEq:aix-linker, r=petrochenkov
matthiaskrgr Mar 24, 2023
4d21d30
Rollup merge of #109536 - petrochenkov:qcstore3, r=cjgillot
matthiaskrgr Mar 24, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add AixLinker to support linking on AIX
  • Loading branch information
Kai Luo committed Mar 23, 2023
commit 485aec41affd054cecc70a73d424b6f4c0f59b98
173 changes: 173 additions & 0 deletions compiler/rustc_codegen_ssa/src/back/linker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,9 @@ pub fn get_linker<'a>(
LinkerFlavor::Unix(Cc::No) if sess.target.os == "l4re" => {
Box::new(L4Bender::new(cmd, sess)) as Box<dyn Linker>
}
LinkerFlavor::Unix(Cc::No) if sess.target.os == "aix" => {
Box::new(AixLinker::new(cmd, sess)) as Box<dyn Linker>
}
LinkerFlavor::WasmLld(Cc::No) => Box::new(WasmLd::new(cmd, sess)) as Box<dyn Linker>,
LinkerFlavor::Gnu(cc, _)
| LinkerFlavor::Darwin(cc, _)
Expand Down Expand Up @@ -1474,6 +1477,176 @@ impl<'a> L4Bender<'a> {
}
}

/// Linker for AIX.
pub struct AixLinker<'a> {
cmd: Command,
sess: &'a Session,
hinted_static: bool,
}

impl<'a> AixLinker<'a> {
pub fn new(cmd: Command, sess: &'a Session) -> AixLinker<'a> {
AixLinker { cmd: cmd, sess: sess, hinted_static: false }
}

fn hint_static(&mut self) {
if !self.hinted_static {
self.cmd.arg("-bstatic");
self.hinted_static = true;
}
}

fn hint_dynamic(&mut self) {
if self.hinted_static {
self.cmd.arg("-bdynamic");
self.hinted_static = false;
}
}

fn build_dylib(&mut self, _out_filename: &Path) {
self.cmd.arg("-bM:SRE");
self.cmd.arg("-bnoentry");
// FIXME: Use CreateExportList utility to create export list
// and remove -bexpfull.
self.cmd.arg("-bexpfull");
}
}

impl<'a> Linker for AixLinker<'a> {
fn link_dylib(&mut self, lib: &str, _verbatim: bool, _as_needed: bool) {
self.hint_dynamic();
self.cmd.arg(format!("-l{}", lib));
}

fn link_staticlib(&mut self, lib: &str, _verbatim: bool) {
self.hint_static();
self.cmd.arg(format!("-l{}", lib));
}

fn link_rlib(&mut self, lib: &Path) {
self.hint_static();
self.cmd.arg(lib);
}

fn include_path(&mut self, path: &Path) {
self.cmd.arg("-L").arg(path);
}

fn framework_path(&mut self, _: &Path) {
bug!("frameworks are not supported on L4Re");
}

fn output_filename(&mut self, path: &Path) {
self.cmd.arg("-o").arg(path);
}

fn add_object(&mut self, path: &Path) {
self.cmd.arg(path);
}

fn full_relro(&mut self) {}

fn partial_relro(&mut self) {}

fn no_relro(&mut self) {}

fn cmd(&mut self) -> &mut Command {
&mut self.cmd
}

fn set_output_kind(&mut self, output_kind: LinkOutputKind, out_filename: &Path) {
match output_kind {
LinkOutputKind::DynamicDylib => {
self.hint_dynamic();
self.build_dylib(out_filename);
}
LinkOutputKind::StaticDylib => {
self.hint_static();
self.build_dylib(out_filename);
}
_ => {}
}
}

fn link_rust_dylib(&mut self, lib: &str, _: &Path) {
self.hint_dynamic();
self.cmd.arg(format!("-l{}", lib));
}

fn link_framework(&mut self, _framework: &str, _as_needed: bool) {
bug!("frameworks not supported on AIX");
}

fn link_whole_staticlib(&mut self, lib: &str, verbatim: bool, search_path: &[PathBuf]) {
self.hint_static();
let lib = find_native_static_library(lib, verbatim, search_path, &self.sess);
self.cmd.arg(format!("-bkeepfile:{}", lib.to_str().unwrap()));
}

fn link_whole_rlib(&mut self, lib: &Path) {
self.hint_static();
self.cmd.arg(format!("-bkeepfile:{}", lib.to_str().unwrap()));
}

fn gc_sections(&mut self, _keep_metadata: bool) {
self.cmd.arg("-bgc");
}

fn no_gc_sections(&mut self) {
self.cmd.arg("-bnogc");
}

fn optimize(&mut self) {}

fn pgo_gen(&mut self) {}

fn control_flow_guard(&mut self) {}

fn debuginfo(&mut self, strip: Strip, _: &[PathBuf]) {
match strip {
Strip::None => {}
Strip::Debuginfo => {}
Strip::Symbols => {
self.cmd.arg("-s");
}
}
}

fn no_crt_objects(&mut self) {}

fn no_default_libraries(&mut self) {}

fn export_symbols(&mut self, tmpdir: &Path, _crate_type: CrateType, symbols: &[String]) {
let path = tmpdir.join("list.exp");
let res: io::Result<()> = try {
let mut f = BufWriter::new(File::create(&path)?);
// TODO: use llvm-nm to generate export list.
for symbol in symbols {
debug!(" _{}", symbol);
writeln!(f, " {}", symbol)?;
}
};
if let Err(e) = res {
self.sess.fatal(&format!("failed to write export file: {}", e));
}
self.cmd.arg(format!("-bE:{}", path.to_str().unwrap()));
}

fn subsystem(&mut self, _subsystem: &str) {}

fn reset_per_library_state(&mut self) {
self.hint_dynamic();
}

fn linker_plugin_lto(&mut self) {}

fn add_eh_frame_header(&mut self) {}

fn add_no_exec(&mut self) {}

fn add_as_needed(&mut self) {}
}

fn for_each_exported_symbols_include_dep<'tcx>(
tcx: TyCtxt<'tcx>,
crate_type: CrateType,
Expand Down