f1dabed82b
We provide tools to tell what exact symbols to emit for any fn or static, but don’t quite check if that won’t cause any issues later on. Some of the issues include LLVM mangling our names again and our names pointing to wrong locations, us generating dumb foreign call wrappers, linker errors, extern functions resolving to different symbols altogether (extern {fn fail();} fail(); in some cases calling fail1()), etc. Before the commit we had a function called note_unique_llvm_symbol, so it is clear somebody was aware of the issue at some point, but the function was barely used, mostly in irrelevant locations. Along with working on it I took liberty to start refactoring trans/base into a few smaller modules. The refactoring is incomplete and I hope I will find some motivation to carry on with it. This is possibly a [breaking-change] because it makes dumbly written code properly invalid.
80 lines
1.7 KiB
Rust
80 lines
1.7 KiB
Rust
// Copyright 2012-2015 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
use llvm::{ContextRef, ModuleRef};
|
|
use metadata::common::LinkMeta;
|
|
use middle::dependency_format;
|
|
|
|
pub use self::base::trans_crate;
|
|
pub use self::context::CrateContext;
|
|
pub use self::common::gensym_name;
|
|
|
|
#[macro_use]
|
|
mod macros;
|
|
|
|
mod adt;
|
|
mod asm;
|
|
mod attributes;
|
|
mod base;
|
|
mod basic_block;
|
|
mod build;
|
|
mod builder;
|
|
mod cabi;
|
|
mod cabi_aarch64;
|
|
mod cabi_arm;
|
|
mod cabi_mips;
|
|
mod cabi_powerpc;
|
|
mod cabi_x86;
|
|
mod cabi_x86_64;
|
|
mod cabi_x86_win64;
|
|
mod callee;
|
|
mod cleanup;
|
|
mod closure;
|
|
mod common;
|
|
mod consts;
|
|
mod context;
|
|
mod controlflow;
|
|
mod datum;
|
|
mod debuginfo;
|
|
mod declare;
|
|
mod expr;
|
|
mod foreign;
|
|
mod glue;
|
|
mod inline;
|
|
mod intrinsic;
|
|
mod llrepr;
|
|
mod machine;
|
|
mod _match;
|
|
mod meth;
|
|
mod monomorphize;
|
|
mod tvec;
|
|
mod type_;
|
|
mod type_of;
|
|
mod value;
|
|
|
|
#[derive(Copy, Clone)]
|
|
pub struct ModuleTranslation {
|
|
pub llcx: ContextRef,
|
|
pub llmod: ModuleRef,
|
|
}
|
|
|
|
unsafe impl Send for ModuleTranslation { }
|
|
unsafe impl Sync for ModuleTranslation { }
|
|
|
|
pub struct CrateTranslation {
|
|
pub modules: Vec<ModuleTranslation>,
|
|
pub metadata_module: ModuleTranslation,
|
|
pub link: LinkMeta,
|
|
pub metadata: Vec<u8>,
|
|
pub reachable: Vec<String>,
|
|
pub crate_formats: dependency_format::Dependencies,
|
|
pub no_builtins: bool,
|
|
}
|