Auto merge of #62592 - nikic:actually-update-llvm, r=alexcrichton
Update to LLVM 9 trunk Following the preparatory changes in #62474, this updates the LLVM submodule to https://github.com/rust-lang/llvm-project/tree/rustc/9.0-2019-07-12 and: * Changes the LLVM Rust bindings to account for the new SubtargetSubTypeKV. * Adjusts a codegen test for the new form of the byval attribute that takes a type. * Makes a PGO codegen test more liberal with regard to order and linkage. * Builds InstrProfilingPlatformWindows.c as part of libprofiler_builtins. * Moves registration of additional passes (in particular sanitizers) to the end of the module pass manager. * Disables LLDB on builders. r? @alexcrichton
This commit is contained in:
commit
38798c6d68
11 changed files with 95 additions and 63 deletions
|
@ -174,7 +174,7 @@ jobs:
|
||||||
|
|
||||||
dist-x86_64-apple:
|
dist-x86_64-apple:
|
||||||
SCRIPT: ./x.py dist
|
SCRIPT: ./x.py dist
|
||||||
RUST_CONFIGURE_ARGS: --target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-full-tools --enable-sanitizers --enable-profiler --enable-lldb --set rust.jemalloc
|
RUST_CONFIGURE_ARGS: --target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc
|
||||||
DEPLOY: 1
|
DEPLOY: 1
|
||||||
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.7
|
MACOSX_DEPLOYMENT_TARGET: 10.7
|
||||||
|
@ -184,7 +184,7 @@ jobs:
|
||||||
|
|
||||||
dist-x86_64-apple-alt:
|
dist-x86_64-apple-alt:
|
||||||
SCRIPT: ./x.py dist
|
SCRIPT: ./x.py dist
|
||||||
RUST_CONFIGURE_ARGS: --enable-extended --enable-profiler --enable-lldb --set rust.jemalloc
|
RUST_CONFIGURE_ARGS: --enable-extended --enable-profiler --set rust.jemalloc
|
||||||
DEPLOY_ALT: 1
|
DEPLOY_ALT: 1
|
||||||
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.7
|
MACOSX_DEPLOYMENT_TARGET: 10.7
|
||||||
|
@ -202,7 +202,7 @@ jobs:
|
||||||
|
|
||||||
dist-i686-apple:
|
dist-i686-apple:
|
||||||
SCRIPT: ./x.py dist
|
SCRIPT: ./x.py dist
|
||||||
RUST_CONFIGURE_ARGS: --build=i686-apple-darwin --enable-full-tools --enable-profiler --enable-lldb --set rust.jemalloc
|
RUST_CONFIGURE_ARGS: --build=i686-apple-darwin --enable-full-tools --enable-profiler --set rust.jemalloc
|
||||||
DEPLOY: 1
|
DEPLOY: 1
|
||||||
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
||||||
MACOSX_DEPLOYMENT_TARGET: 10.7
|
MACOSX_DEPLOYMENT_TARGET: 10.7
|
||||||
|
|
|
@ -36,7 +36,7 @@ jobs:
|
||||||
# matrix:
|
# matrix:
|
||||||
# dist-x86_64-apple:
|
# dist-x86_64-apple:
|
||||||
# SCRIPT: ./x.py dist
|
# SCRIPT: ./x.py dist
|
||||||
# RUST_CONFIGURE_ARGS: --target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-full-tools --enable-sanitizers --enable-profiler --enable-lldb --set rust.jemalloc
|
# RUST_CONFIGURE_ARGS: --target=aarch64-apple-ios,armv7-apple-ios,armv7s-apple-ios,i386-apple-ios,x86_64-apple-ios --enable-full-tools --enable-sanitizers --enable-profiler --set rust.jemalloc
|
||||||
# DEPLOY: 1
|
# DEPLOY: 1
|
||||||
# RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
# RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
||||||
# MACOSX_DEPLOYMENT_TARGET: 10.7
|
# MACOSX_DEPLOYMENT_TARGET: 10.7
|
||||||
|
@ -46,7 +46,7 @@ jobs:
|
||||||
#
|
#
|
||||||
# dist-x86_64-apple-alt:
|
# dist-x86_64-apple-alt:
|
||||||
# SCRIPT: ./x.py dist
|
# SCRIPT: ./x.py dist
|
||||||
# RUST_CONFIGURE_ARGS: --enable-extended --enable-profiler --enable-lldb --set rust.jemalloc
|
# RUST_CONFIGURE_ARGS: --enable-extended --enable-profiler --set rust.jemalloc
|
||||||
# DEPLOY_ALT: 1
|
# DEPLOY_ALT: 1
|
||||||
# RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
# RUSTC_RETRY_LINKER_ON_SEGFAULT: 1
|
||||||
# MACOSX_DEPLOYMENT_TARGET: 10.7
|
# MACOSX_DEPLOYMENT_TARGET: 10.7
|
||||||
|
|
2
.gitmodules
vendored
2
.gitmodules
vendored
|
@ -43,7 +43,7 @@
|
||||||
[submodule "src/llvm-project"]
|
[submodule "src/llvm-project"]
|
||||||
path = src/llvm-project
|
path = src/llvm-project
|
||||||
url = https://github.com/rust-lang/llvm-project.git
|
url = https://github.com/rust-lang/llvm-project.git
|
||||||
branch = rustc/8.0-2019-03-18
|
branch = rustc/9.0-2019-07-12
|
||||||
[submodule "src/doc/embedded-book"]
|
[submodule "src/doc/embedded-book"]
|
||||||
path = src/doc/embedded-book
|
path = src/doc/embedded-book
|
||||||
url = https://github.com/rust-embedded/book.git
|
url = https://github.com/rust-embedded/book.git
|
||||||
|
|
|
@ -33,7 +33,6 @@ ENV RUST_CONFIGURE_ARGS \
|
||||||
--build=x86_64-unknown-linux-gnu \
|
--build=x86_64-unknown-linux-gnu \
|
||||||
--enable-debug \
|
--enable-debug \
|
||||||
--enable-lld \
|
--enable-lld \
|
||||||
--enable-lldb \
|
|
||||||
--enable-optimize \
|
--enable-optimize \
|
||||||
--set llvm.use-linker=lld \
|
--set llvm.use-linker=lld \
|
||||||
--set target.x86_64-unknown-linux-gnu.linker=clang \
|
--set target.x86_64-unknown-linux-gnu.linker=clang \
|
||||||
|
|
|
@ -19,6 +19,7 @@ fn main() {
|
||||||
"InstrProfilingPlatformDarwin.c",
|
"InstrProfilingPlatformDarwin.c",
|
||||||
"InstrProfilingPlatformLinux.c",
|
"InstrProfilingPlatformLinux.c",
|
||||||
"InstrProfilingPlatformOther.c",
|
"InstrProfilingPlatformOther.c",
|
||||||
|
"InstrProfilingPlatformWindows.c",
|
||||||
"InstrProfilingRuntime.cc",
|
"InstrProfilingRuntime.cc",
|
||||||
"InstrProfilingUtil.c",
|
"InstrProfilingUtil.c",
|
||||||
"InstrProfilingValue.c",
|
"InstrProfilingValue.c",
|
||||||
|
|
|
@ -329,33 +329,55 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext<LlvmCodegenBackend>,
|
||||||
let mpm = llvm::LLVMCreatePassManager();
|
let mpm = llvm::LLVMCreatePassManager();
|
||||||
|
|
||||||
{
|
{
|
||||||
// If we're verifying or linting, add them to the function pass
|
let find_pass = |pass_name: &str| {
|
||||||
// manager.
|
|
||||||
let addpass = |pass_name: &str| {
|
|
||||||
let pass_name = SmallCStr::new(pass_name);
|
let pass_name = SmallCStr::new(pass_name);
|
||||||
let pass = match llvm::LLVMRustFindAndCreatePass(pass_name.as_ptr()) {
|
llvm::LLVMRustFindAndCreatePass(pass_name.as_ptr())
|
||||||
Some(pass) => pass,
|
|
||||||
None => return false,
|
|
||||||
};
|
|
||||||
let pass_manager = match llvm::LLVMRustPassKind(pass) {
|
|
||||||
llvm::PassKind::Function => &*fpm,
|
|
||||||
llvm::PassKind::Module => &*mpm,
|
|
||||||
llvm::PassKind::Other => {
|
|
||||||
diag_handler.err("Encountered LLVM pass kind we can't handle");
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
};
|
|
||||||
llvm::LLVMRustAddPass(pass_manager, pass);
|
|
||||||
true
|
|
||||||
};
|
};
|
||||||
|
|
||||||
if config.verify_llvm_ir { assert!(addpass("verify")); }
|
if config.verify_llvm_ir {
|
||||||
|
// Verification should run as the very first pass.
|
||||||
|
llvm::LLVMRustAddPass(fpm, find_pass("verify").unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut extra_passes = Vec::new();
|
||||||
|
let mut have_name_anon_globals_pass = false;
|
||||||
|
|
||||||
|
for pass_name in &config.passes {
|
||||||
|
if pass_name == "lint" {
|
||||||
|
// Linting should also be performed early, directly on the generated IR.
|
||||||
|
llvm::LLVMRustAddPass(fpm, find_pass("lint").unwrap());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if let Some(pass) = find_pass(pass_name) {
|
||||||
|
extra_passes.push(pass);
|
||||||
|
} else {
|
||||||
|
diag_handler.warn(&format!("unknown pass `{}`, ignoring", pass_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
if pass_name == "name-anon-globals" {
|
||||||
|
have_name_anon_globals_pass = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for pass_name in &cgcx.plugin_passes {
|
||||||
|
if let Some(pass) = find_pass(pass_name) {
|
||||||
|
extra_passes.push(pass);
|
||||||
|
} else {
|
||||||
|
diag_handler.err(&format!("a plugin asked for LLVM pass \
|
||||||
|
`{}` but LLVM does not \
|
||||||
|
recognize it", pass_name));
|
||||||
|
}
|
||||||
|
|
||||||
|
if pass_name == "name-anon-globals" {
|
||||||
|
have_name_anon_globals_pass = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Some options cause LLVM bitcode to be emitted, which uses ThinLTOBuffers, so we need
|
// Some options cause LLVM bitcode to be emitted, which uses ThinLTOBuffers, so we need
|
||||||
// to make sure we run LLVM's NameAnonGlobals pass when emitting bitcode; otherwise
|
// to make sure we run LLVM's NameAnonGlobals pass when emitting bitcode; otherwise
|
||||||
// we'll get errors in LLVM.
|
// we'll get errors in LLVM.
|
||||||
let using_thin_buffers = config.bitcode_needed();
|
let using_thin_buffers = config.bitcode_needed();
|
||||||
let mut have_name_anon_globals_pass = false;
|
|
||||||
if !config.no_prepopulate_passes {
|
if !config.no_prepopulate_passes {
|
||||||
llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod);
|
llvm::LLVMRustAddAnalysisPasses(tm, fpm, llmod);
|
||||||
llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod);
|
llvm::LLVMRustAddAnalysisPasses(tm, mpm, llmod);
|
||||||
|
@ -364,34 +386,22 @@ pub(crate) unsafe fn optimize(cgcx: &CodegenContext<LlvmCodegenBackend>,
|
||||||
let prepare_for_thin_lto = cgcx.lto == Lto::Thin || cgcx.lto == Lto::ThinLocal ||
|
let prepare_for_thin_lto = cgcx.lto == Lto::Thin || cgcx.lto == Lto::ThinLocal ||
|
||||||
(cgcx.lto != Lto::Fat && cgcx.opts.cg.linker_plugin_lto.enabled());
|
(cgcx.lto != Lto::Fat && cgcx.opts.cg.linker_plugin_lto.enabled());
|
||||||
with_llvm_pmb(llmod, &config, opt_level, prepare_for_thin_lto, &mut |b| {
|
with_llvm_pmb(llmod, &config, opt_level, prepare_for_thin_lto, &mut |b| {
|
||||||
|
llvm::LLVMRustAddLastExtensionPasses(
|
||||||
|
b, extra_passes.as_ptr(), extra_passes.len() as size_t);
|
||||||
llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(b, fpm);
|
llvm::LLVMPassManagerBuilderPopulateFunctionPassManager(b, fpm);
|
||||||
llvm::LLVMPassManagerBuilderPopulateModulePassManager(b, mpm);
|
llvm::LLVMPassManagerBuilderPopulateModulePassManager(b, mpm);
|
||||||
});
|
});
|
||||||
|
|
||||||
have_name_anon_globals_pass = have_name_anon_globals_pass || prepare_for_thin_lto;
|
have_name_anon_globals_pass = have_name_anon_globals_pass || prepare_for_thin_lto;
|
||||||
if using_thin_buffers && !prepare_for_thin_lto {
|
if using_thin_buffers && !prepare_for_thin_lto {
|
||||||
assert!(addpass("name-anon-globals"));
|
llvm::LLVMRustAddPass(mpm, find_pass("name-anon-globals").unwrap());
|
||||||
have_name_anon_globals_pass = true;
|
have_name_anon_globals_pass = true;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
|
// If we don't use the standard pipeline, directly populate the MPM
|
||||||
for pass in &config.passes {
|
// with the extra passes.
|
||||||
if !addpass(pass) {
|
for pass in extra_passes {
|
||||||
diag_handler.warn(&format!("unknown pass `{}`, ignoring", pass));
|
llvm::LLVMRustAddPass(mpm, pass);
|
||||||
}
|
|
||||||
if pass == "name-anon-globals" {
|
|
||||||
have_name_anon_globals_pass = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for pass in &cgcx.plugin_passes {
|
|
||||||
if !addpass(pass) {
|
|
||||||
diag_handler.err(&format!("a plugin asked for LLVM pass \
|
|
||||||
`{}` but LLVM does not \
|
|
||||||
recognize it", pass));
|
|
||||||
}
|
|
||||||
if pass == "name-anon-globals" {
|
|
||||||
have_name_anon_globals_pass = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1668,6 +1668,9 @@ extern "C" {
|
||||||
pub fn LLVMRustPassKind(Pass: &Pass) -> PassKind;
|
pub fn LLVMRustPassKind(Pass: &Pass) -> PassKind;
|
||||||
pub fn LLVMRustFindAndCreatePass(Pass: *const c_char) -> Option<&'static mut Pass>;
|
pub fn LLVMRustFindAndCreatePass(Pass: *const c_char) -> Option<&'static mut Pass>;
|
||||||
pub fn LLVMRustAddPass(PM: &PassManager<'_>, Pass: &'static mut Pass);
|
pub fn LLVMRustAddPass(PM: &PassManager<'_>, Pass: &'static mut Pass);
|
||||||
|
pub fn LLVMRustAddLastExtensionPasses(PMB: &PassManagerBuilder,
|
||||||
|
Passes: *const &'static mut Pass,
|
||||||
|
NumPasses: size_t);
|
||||||
|
|
||||||
pub fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
|
pub fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
|
||||||
|
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 6c1a545b269bc046743c6bb9b0173ec37bd624ab
|
Subproject commit f6446fa8e9629ffb1861303f17930c3aa83ef660
|
|
@ -99,6 +99,23 @@ void LLVMRustPassManagerBuilderPopulateThinLTOPassManager(
|
||||||
unwrap(PMBR)->populateThinLTOPassManager(*unwrap(PMR));
|
unwrap(PMBR)->populateThinLTOPassManager(*unwrap(PMR));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C"
|
||||||
|
void LLVMRustAddLastExtensionPasses(
|
||||||
|
LLVMPassManagerBuilderRef PMBR, LLVMPassRef *Passes, size_t NumPasses) {
|
||||||
|
auto AddExtensionPasses = [Passes, NumPasses](
|
||||||
|
const PassManagerBuilder &Builder, PassManagerBase &PM) {
|
||||||
|
for (size_t I = 0; I < NumPasses; I++) {
|
||||||
|
PM.add(unwrap(Passes[I]));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
// Add the passes to both of the pre-finalization extension points,
|
||||||
|
// so they are run for optimized and non-optimized builds.
|
||||||
|
unwrap(PMBR)->addExtension(PassManagerBuilder::EP_OptimizerLast,
|
||||||
|
AddExtensionPasses);
|
||||||
|
unwrap(PMBR)->addExtension(PassManagerBuilder::EP_EnabledOnOptLevel0,
|
||||||
|
AddExtensionPasses);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef LLVM_COMPONENT_X86
|
#ifdef LLVM_COMPONENT_X86
|
||||||
#define SUBTARGET_X86 SUBTARGET(X86)
|
#define SUBTARGET_X86 SUBTARGET(X86)
|
||||||
#else
|
#else
|
||||||
|
@ -266,8 +283,8 @@ static Optional<Reloc::Model> fromRust(LLVMRustRelocMode RustReloc) {
|
||||||
|
|
||||||
#ifdef LLVM_RUSTLLVM
|
#ifdef LLVM_RUSTLLVM
|
||||||
/// getLongestEntryLength - Return the length of the longest entry in the table.
|
/// getLongestEntryLength - Return the length of the longest entry in the table.
|
||||||
///
|
template<typename KV>
|
||||||
static size_t getLongestEntryLength(ArrayRef<SubtargetFeatureKV> Table) {
|
static size_t getLongestEntryLength(ArrayRef<KV> Table) {
|
||||||
size_t MaxLen = 0;
|
size_t MaxLen = 0;
|
||||||
for (auto &I : Table)
|
for (auto &I : Table)
|
||||||
MaxLen = std::max(MaxLen, std::strlen(I.Key));
|
MaxLen = std::max(MaxLen, std::strlen(I.Key));
|
||||||
|
@ -279,7 +296,7 @@ extern "C" void LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM) {
|
||||||
const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo();
|
const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo();
|
||||||
const Triple::ArchType HostArch = Triple(sys::getProcessTriple()).getArch();
|
const Triple::ArchType HostArch = Triple(sys::getProcessTriple()).getArch();
|
||||||
const Triple::ArchType TargetArch = Target->getTargetTriple().getArch();
|
const Triple::ArchType TargetArch = Target->getTargetTriple().getArch();
|
||||||
const ArrayRef<SubtargetFeatureKV> CPUTable = MCInfo->getCPUTable();
|
const ArrayRef<SubtargetSubTypeKV> CPUTable = MCInfo->getCPUTable();
|
||||||
unsigned MaxCPULen = getLongestEntryLength(CPUTable);
|
unsigned MaxCPULen = getLongestEntryLength(CPUTable);
|
||||||
|
|
||||||
printf("Available CPUs for this target:\n");
|
printf("Available CPUs for this target:\n");
|
||||||
|
@ -289,7 +306,7 @@ extern "C" void LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM) {
|
||||||
MaxCPULen, "native", (int)HostCPU.size(), HostCPU.data());
|
MaxCPULen, "native", (int)HostCPU.size(), HostCPU.data());
|
||||||
}
|
}
|
||||||
for (auto &CPU : CPUTable)
|
for (auto &CPU : CPUTable)
|
||||||
printf(" %-*s - %s.\n", MaxCPULen, CPU.Key, CPU.Desc);
|
printf(" %-*s\n", MaxCPULen, CPU.Key);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
// compile-flags: -Cprofile-generate -Ccodegen-units=1 -Cpanic=abort
|
// compile-flags: -Cprofile-generate -Ccodegen-units=1 -Cpanic=abort
|
||||||
|
|
||||||
// CHECK: @__llvm_profile_raw_version =
|
// CHECK: @__llvm_profile_raw_version =
|
||||||
// CHECK: @__profc_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = private global
|
// CHECK-DAG: @__profc_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = {{.*}}global
|
||||||
// CHECK: @__profd_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = private global
|
// CHECK-DAG: @__profd_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = {{.*}}global
|
||||||
// CHECK: @__profc_{{.*}}pgo_instrumentation{{.*}}some_other_function{{.*}} = private global
|
// CHECK-DAG: @__profc_{{.*}}pgo_instrumentation{{.*}}some_other_function{{.*}} = {{.*}}global
|
||||||
// CHECK: @__profd_{{.*}}pgo_instrumentation{{.*}}some_other_function{{.*}} = private global
|
// CHECK-DAG: @__profd_{{.*}}pgo_instrumentation{{.*}}some_other_function{{.*}} = {{.*}}global
|
||||||
// CHECK: @__llvm_profile_filename = {{.*}}"default_%m.profraw\00"{{.*}}
|
// CHECK: @__llvm_profile_filename = {{.*}}"default_%m.profraw\00"{{.*}}
|
||||||
|
|
||||||
#![crate_type="lib"]
|
#![crate_type="lib"]
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
|
// min-system-llvm-version: 9.0
|
||||||
// ignore-arm
|
// ignore-arm
|
||||||
// ignore-mips
|
// ignore-mips
|
||||||
// ignore-mips64
|
// ignore-mips64
|
||||||
// ignore-powerpc
|
// ignore-powerpc
|
||||||
// ignore-powerpc64
|
// ignore-powerpc64
|
||||||
|
// ignore-windows
|
||||||
// See repr-transparent.rs
|
// See repr-transparent.rs
|
||||||
|
|
||||||
#![feature(transparent_enums, transparent_unions)]
|
#![feature(transparent_enums, transparent_unions)]
|
||||||
|
@ -30,19 +32,19 @@ pub enum TeBigS {
|
||||||
Variant(BigS),
|
Variant(BigS),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], %BigS* [[BIGS_ARG_ATTRS:.*]])
|
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], %BigS* [[BIGS_ARG_ATTRS1:.*]] byval(%BigS) [[BIGS_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_BigS(_: BigS) -> BigS { loop {} }
|
pub extern fn test_BigS(_: BigS) -> BigS { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS]], %TsBigS* [[BIGS_ARG_ATTRS]])
|
// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS]], %TsBigS* [[BIGS_ARG_ATTRS1]] byval(%TsBigS) [[BIGS_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} }
|
pub extern fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS]], %TuBigS* [[BIGS_ARG_ATTRS]])
|
// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS]], %TuBigS* [[BIGS_ARG_ATTRS1]] byval(%TuBigS) [[BIGS_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} }
|
pub extern fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS]], %"TeBigS::Variant"* [[BIGS_ARG_ATTRS]])
|
// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS]], %"TeBigS::Variant"* [[BIGS_ARG_ATTRS1]] byval(%"TeBigS::Variant") [[BIGS_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
||||||
|
|
||||||
|
@ -66,18 +68,18 @@ pub enum TeBigU {
|
||||||
Variant(BigU),
|
Variant(BigU),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], %BigU* [[BIGU_ARG_ATTRS:.*]])
|
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], %BigU* [[BIGU_ARG_ATTRS1:.*]] byval(%BigU) [[BIGU_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_BigU(_: BigU) -> BigU { loop {} }
|
pub extern fn test_BigU(_: BigU) -> BigU { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS:.*]], %TsBigU* [[BIGU_ARG_ATTRS]])
|
// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS:.*]], %TsBigU* [[BIGU_ARG_ATTRS1]] byval(%TsBigU) [[BIGU_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} }
|
pub extern fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS]], %TuBigU* [[BIGU_ARG_ATTRS]])
|
// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS]], %TuBigU* [[BIGU_ARG_ATTRS1]] byval(%TuBigU) [[BIGU_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} }
|
pub extern fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS]], %"TeBigU::Variant"* [[BIGU_ARG_ATTRS]])
|
// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS]], %"TeBigU::Variant"* [[BIGU_ARG_ATTRS1]] byval(%"TeBigU::Variant") [[BIGU_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue