Auto merge of #81451 - nikic:llvm-12, r=nagisa
Upgrade to LLVM 12 This implements the necessary adjustments to make rustc work with LLVM 12. I didn't encounter any major issues so far. r? `@cuviper`
This commit is contained in:
commit
409920873c
57 changed files with 402 additions and 101 deletions
2
.gitmodules
vendored
2
.gitmodules
vendored
|
@ -37,7 +37,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/11.0-2021-01-05
|
branch = rustc/12.0-2021-02-03
|
||||||
[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
|
||||||
|
|
|
@ -430,7 +430,13 @@ impl<'tcx> FnAbiLlvmExt<'tcx> for FnAbi<'tcx, Ty<'tcx>> {
|
||||||
PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => {
|
PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => {
|
||||||
assert!(!on_stack);
|
assert!(!on_stack);
|
||||||
let i = apply(attrs);
|
let i = apply(attrs);
|
||||||
llvm::Attribute::StructRet.apply_llfn(llvm::AttributePlace::Argument(i), llfn);
|
unsafe {
|
||||||
|
llvm::LLVMRustAddStructRetAttr(
|
||||||
|
llfn,
|
||||||
|
llvm::AttributePlace::Argument(i).as_uint(),
|
||||||
|
self.ret.layout.llvm_type(cx),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
@ -486,8 +492,13 @@ impl<'tcx> FnAbiLlvmExt<'tcx> for FnAbi<'tcx, Ty<'tcx>> {
|
||||||
PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => {
|
PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => {
|
||||||
assert!(!on_stack);
|
assert!(!on_stack);
|
||||||
let i = apply(attrs);
|
let i = apply(attrs);
|
||||||
llvm::Attribute::StructRet
|
unsafe {
|
||||||
.apply_callsite(llvm::AttributePlace::Argument(i), callsite);
|
llvm::LLVMRustAddStructRetCallSiteAttr(
|
||||||
|
callsite,
|
||||||
|
llvm::AttributePlace::Argument(i).as_uint(),
|
||||||
|
self.ret.layout.llvm_type(bx),
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -304,6 +304,7 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> {
|
||||||
} else if options.contains(InlineAsmOptions::READONLY) {
|
} else if options.contains(InlineAsmOptions::READONLY) {
|
||||||
llvm::Attribute::ReadOnly.apply_callsite(llvm::AttributePlace::Function, result);
|
llvm::Attribute::ReadOnly.apply_callsite(llvm::AttributePlace::Function, result);
|
||||||
}
|
}
|
||||||
|
llvm::Attribute::WillReturn.apply_callsite(llvm::AttributePlace::Function, result);
|
||||||
} else if options.contains(InlineAsmOptions::NOMEM) {
|
} else if options.contains(InlineAsmOptions::NOMEM) {
|
||||||
llvm::Attribute::InaccessibleMemOnly
|
llvm::Attribute::InaccessibleMemOnly
|
||||||
.apply_callsite(llvm::AttributePlace::Function, result);
|
.apply_callsite(llvm::AttributePlace::Function, result);
|
||||||
|
|
|
@ -104,6 +104,10 @@ fn strip_x86_address_spaces(data_layout: String) -> String {
|
||||||
data_layout.replace("-p270:32:32-p271:32:32-p272:64:64-", "-")
|
data_layout.replace("-p270:32:32-p271:32:32-p272:64:64-", "-")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn strip_powerpc64_vectors(data_layout: String) -> String {
|
||||||
|
data_layout.replace("-v256:256:256-v512:512:512", "")
|
||||||
|
}
|
||||||
|
|
||||||
pub unsafe fn create_module(
|
pub unsafe fn create_module(
|
||||||
tcx: TyCtxt<'_>,
|
tcx: TyCtxt<'_>,
|
||||||
llcx: &'ll llvm::Context,
|
llcx: &'ll llvm::Context,
|
||||||
|
@ -119,6 +123,9 @@ pub unsafe fn create_module(
|
||||||
{
|
{
|
||||||
target_data_layout = strip_x86_address_spaces(target_data_layout);
|
target_data_layout = strip_x86_address_spaces(target_data_layout);
|
||||||
}
|
}
|
||||||
|
if llvm_util::get_version() < (12, 0, 0) && sess.target.arch == "powerpc64" {
|
||||||
|
target_data_layout = strip_powerpc64_vectors(target_data_layout);
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure the data-layout values hardcoded remain the defaults.
|
// Ensure the data-layout values hardcoded remain the defaults.
|
||||||
if sess.target.is_builtin {
|
if sess.target.is_builtin {
|
||||||
|
|
|
@ -162,7 +162,7 @@ pub(crate) fn write_filenames_section_to_buffer<'a>(
|
||||||
pub(crate) fn write_mapping_to_buffer(
|
pub(crate) fn write_mapping_to_buffer(
|
||||||
virtual_file_mapping: Vec<u32>,
|
virtual_file_mapping: Vec<u32>,
|
||||||
expressions: Vec<CounterExpression>,
|
expressions: Vec<CounterExpression>,
|
||||||
mut mapping_regions: Vec<CounterMappingRegion>,
|
mapping_regions: Vec<CounterMappingRegion>,
|
||||||
buffer: &RustString,
|
buffer: &RustString,
|
||||||
) {
|
) {
|
||||||
unsafe {
|
unsafe {
|
||||||
|
@ -171,7 +171,7 @@ pub(crate) fn write_mapping_to_buffer(
|
||||||
virtual_file_mapping.len() as c_uint,
|
virtual_file_mapping.len() as c_uint,
|
||||||
expressions.as_ptr(),
|
expressions.as_ptr(),
|
||||||
expressions.len() as c_uint,
|
expressions.len() as c_uint,
|
||||||
mapping_regions.as_mut_ptr(),
|
mapping_regions.as_ptr(),
|
||||||
mapping_regions.len() as c_uint,
|
mapping_regions.len() as c_uint,
|
||||||
buffer,
|
buffer,
|
||||||
);
|
);
|
||||||
|
|
|
@ -132,6 +132,7 @@ pub enum Attribute {
|
||||||
ReadNone = 26,
|
ReadNone = 26,
|
||||||
InaccessibleMemOnly = 27,
|
InaccessibleMemOnly = 27,
|
||||||
SanitizeHWAddress = 28,
|
SanitizeHWAddress = 28,
|
||||||
|
WillReturn = 29,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// LLVMIntPredicate
|
/// LLVMIntPredicate
|
||||||
|
@ -239,6 +240,7 @@ pub enum TypeKind {
|
||||||
Token = 16,
|
Token = 16,
|
||||||
ScalableVector = 17,
|
ScalableVector = 17,
|
||||||
BFloat = 18,
|
BFloat = 18,
|
||||||
|
X86_AMX = 19,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TypeKind {
|
impl TypeKind {
|
||||||
|
@ -263,6 +265,7 @@ impl TypeKind {
|
||||||
TypeKind::Token => rustc_codegen_ssa::common::TypeKind::Token,
|
TypeKind::Token => rustc_codegen_ssa::common::TypeKind::Token,
|
||||||
TypeKind::ScalableVector => rustc_codegen_ssa::common::TypeKind::ScalableVector,
|
TypeKind::ScalableVector => rustc_codegen_ssa::common::TypeKind::ScalableVector,
|
||||||
TypeKind::BFloat => rustc_codegen_ssa::common::TypeKind::BFloat,
|
TypeKind::BFloat => rustc_codegen_ssa::common::TypeKind::BFloat,
|
||||||
|
TypeKind::X86_AMX => rustc_codegen_ssa::common::TypeKind::X86_AMX,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -674,9 +677,7 @@ pub mod coverageinfo {
|
||||||
/// array", encoded separately), and source location (start and end positions of the represented
|
/// array", encoded separately), and source location (start and end positions of the represented
|
||||||
/// code region).
|
/// code region).
|
||||||
///
|
///
|
||||||
/// Aligns with [llvm::coverage::CounterMappingRegion](https://github.com/rust-lang/llvm-project/blob/rustc/11.0-2020-10-12/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L224-L227)
|
/// Matches LLVMRustCounterMappingRegion.
|
||||||
/// Important: The Rust struct layout (order and types of fields) must match its C++
|
|
||||||
/// counterpart.
|
|
||||||
#[derive(Copy, Clone, Debug)]
|
#[derive(Copy, Clone, Debug)]
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct CounterMappingRegion {
|
pub struct CounterMappingRegion {
|
||||||
|
@ -1073,6 +1074,7 @@ extern "C" {
|
||||||
pub fn LLVMRustAddDereferenceableAttr(Fn: &Value, index: c_uint, bytes: u64);
|
pub fn LLVMRustAddDereferenceableAttr(Fn: &Value, index: c_uint, bytes: u64);
|
||||||
pub fn LLVMRustAddDereferenceableOrNullAttr(Fn: &Value, index: c_uint, bytes: u64);
|
pub fn LLVMRustAddDereferenceableOrNullAttr(Fn: &Value, index: c_uint, bytes: u64);
|
||||||
pub fn LLVMRustAddByValAttr(Fn: &Value, index: c_uint, ty: &Type);
|
pub fn LLVMRustAddByValAttr(Fn: &Value, index: c_uint, ty: &Type);
|
||||||
|
pub fn LLVMRustAddStructRetAttr(Fn: &Value, index: c_uint, ty: &Type);
|
||||||
pub fn LLVMRustAddFunctionAttribute(Fn: &Value, index: c_uint, attr: Attribute);
|
pub fn LLVMRustAddFunctionAttribute(Fn: &Value, index: c_uint, attr: Attribute);
|
||||||
pub fn LLVMRustAddFunctionAttrStringValue(
|
pub fn LLVMRustAddFunctionAttrStringValue(
|
||||||
Fn: &Value,
|
Fn: &Value,
|
||||||
|
@ -1108,6 +1110,7 @@ extern "C" {
|
||||||
pub fn LLVMRustAddDereferenceableCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64);
|
pub fn LLVMRustAddDereferenceableCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64);
|
||||||
pub fn LLVMRustAddDereferenceableOrNullCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64);
|
pub fn LLVMRustAddDereferenceableOrNullCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64);
|
||||||
pub fn LLVMRustAddByValCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type);
|
pub fn LLVMRustAddByValCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type);
|
||||||
|
pub fn LLVMRustAddStructRetCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type);
|
||||||
|
|
||||||
// Operations on load/store instructions (only)
|
// Operations on load/store instructions (only)
|
||||||
pub fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
|
pub fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
|
||||||
|
@ -1792,7 +1795,7 @@ extern "C" {
|
||||||
NumVirtualFileMappingIDs: c_uint,
|
NumVirtualFileMappingIDs: c_uint,
|
||||||
Expressions: *const coverage_map::CounterExpression,
|
Expressions: *const coverage_map::CounterExpression,
|
||||||
NumExpressions: c_uint,
|
NumExpressions: c_uint,
|
||||||
MappingRegions: *mut coverageinfo::CounterMappingRegion,
|
MappingRegions: *const coverageinfo::CounterMappingRegion,
|
||||||
NumMappingRegions: c_uint,
|
NumMappingRegions: c_uint,
|
||||||
BufferOut: &RustString,
|
BufferOut: &RustString,
|
||||||
);
|
);
|
||||||
|
|
|
@ -95,6 +95,7 @@ pub enum TypeKind {
|
||||||
Token,
|
Token,
|
||||||
ScalableVector,
|
ScalableVector,
|
||||||
BFloat,
|
BFloat,
|
||||||
|
X86_AMX,
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME(mw): Anything that is produced via DepGraph::with_task() must implement
|
// FIXME(mw): Anything that is produced via DepGraph::with_task() must implement
|
||||||
|
|
|
@ -8,6 +8,17 @@
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
|
struct LLVMRustCounterMappingRegion {
|
||||||
|
coverage::Counter Count;
|
||||||
|
uint32_t FileID;
|
||||||
|
uint32_t ExpandedFileID;
|
||||||
|
uint32_t LineStart;
|
||||||
|
uint32_t ColumnStart;
|
||||||
|
uint32_t LineEnd;
|
||||||
|
uint32_t ColumnEnd;
|
||||||
|
coverage::CounterMappingRegion::RegionKind Kind;
|
||||||
|
};
|
||||||
|
|
||||||
extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
|
extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer(
|
||||||
const char* const Filenames[],
|
const char* const Filenames[],
|
||||||
size_t FilenamesLen,
|
size_t FilenamesLen,
|
||||||
|
@ -27,13 +38,22 @@ extern "C" void LLVMRustCoverageWriteMappingToBuffer(
|
||||||
unsigned NumVirtualFileMappingIDs,
|
unsigned NumVirtualFileMappingIDs,
|
||||||
const coverage::CounterExpression *Expressions,
|
const coverage::CounterExpression *Expressions,
|
||||||
unsigned NumExpressions,
|
unsigned NumExpressions,
|
||||||
coverage::CounterMappingRegion *MappingRegions,
|
LLVMRustCounterMappingRegion *RustMappingRegions,
|
||||||
unsigned NumMappingRegions,
|
unsigned NumMappingRegions,
|
||||||
RustStringRef BufferOut) {
|
RustStringRef BufferOut) {
|
||||||
|
// Convert from FFI representation to LLVM representation.
|
||||||
|
SmallVector<coverage::CounterMappingRegion, 0> MappingRegions;
|
||||||
|
MappingRegions.reserve(NumMappingRegions);
|
||||||
|
for (const auto &Region : makeArrayRef(RustMappingRegions, NumMappingRegions)) {
|
||||||
|
MappingRegions.emplace_back(
|
||||||
|
Region.Count, Region.FileID, Region.ExpandedFileID,
|
||||||
|
Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd,
|
||||||
|
Region.Kind);
|
||||||
|
}
|
||||||
auto CoverageMappingWriter = coverage::CoverageMappingWriter(
|
auto CoverageMappingWriter = coverage::CoverageMappingWriter(
|
||||||
makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
|
makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs),
|
||||||
makeArrayRef(Expressions, NumExpressions),
|
makeArrayRef(Expressions, NumExpressions),
|
||||||
makeMutableArrayRef(MappingRegions, NumMappingRegions));
|
MappingRegions);
|
||||||
RawRustStringOstream OS(BufferOut);
|
RawRustStringOstream OS(BufferOut);
|
||||||
CoverageMappingWriter.write(OS);
|
CoverageMappingWriter.write(OS);
|
||||||
}
|
}
|
||||||
|
|
|
@ -86,6 +86,7 @@ enum LLVMRustAttribute {
|
||||||
ReadNone = 26,
|
ReadNone = 26,
|
||||||
InaccessibleMemOnly = 27,
|
InaccessibleMemOnly = 27,
|
||||||
SanitizeHWAddress = 28,
|
SanitizeHWAddress = 28,
|
||||||
|
WillReturn = 29,
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct OpaqueRustString *RustStringRef;
|
typedef struct OpaqueRustString *RustStringRef;
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include "LLVMWrapper.h"
|
#include "LLVMWrapper.h"
|
||||||
|
|
||||||
|
#include "llvm/Analysis/AliasAnalysis.h"
|
||||||
#include "llvm/Analysis/TargetLibraryInfo.h"
|
#include "llvm/Analysis/TargetLibraryInfo.h"
|
||||||
#include "llvm/Analysis/TargetTransformInfo.h"
|
#include "llvm/Analysis/TargetTransformInfo.h"
|
||||||
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
#include "llvm/CodeGen/TargetSubtargetInfo.h"
|
||||||
|
@ -683,6 +684,25 @@ void LLVMSelfProfileInitializeCallbacks(
|
||||||
PassInstrumentationCallbacks& PIC, void* LlvmSelfProfiler,
|
PassInstrumentationCallbacks& PIC, void* LlvmSelfProfiler,
|
||||||
LLVMRustSelfProfileBeforePassCallback BeforePassCallback,
|
LLVMRustSelfProfileBeforePassCallback BeforePassCallback,
|
||||||
LLVMRustSelfProfileAfterPassCallback AfterPassCallback) {
|
LLVMRustSelfProfileAfterPassCallback AfterPassCallback) {
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
PIC.registerBeforeNonSkippedPassCallback([LlvmSelfProfiler, BeforePassCallback](
|
||||||
|
StringRef Pass, llvm::Any Ir) {
|
||||||
|
std::string PassName = Pass.str();
|
||||||
|
std::string IrName = LLVMRustwrappedIrGetName(Ir);
|
||||||
|
BeforePassCallback(LlvmSelfProfiler, PassName.c_str(), IrName.c_str());
|
||||||
|
});
|
||||||
|
|
||||||
|
PIC.registerAfterPassCallback(
|
||||||
|
[LlvmSelfProfiler, AfterPassCallback](StringRef Pass, llvm::Any IR,
|
||||||
|
const PreservedAnalyses &Preserved) {
|
||||||
|
AfterPassCallback(LlvmSelfProfiler);
|
||||||
|
});
|
||||||
|
|
||||||
|
PIC.registerAfterPassInvalidatedCallback(
|
||||||
|
[LlvmSelfProfiler, AfterPassCallback](StringRef Pass, const PreservedAnalyses &Preserved) {
|
||||||
|
AfterPassCallback(LlvmSelfProfiler);
|
||||||
|
});
|
||||||
|
#else
|
||||||
PIC.registerBeforePassCallback([LlvmSelfProfiler, BeforePassCallback](
|
PIC.registerBeforePassCallback([LlvmSelfProfiler, BeforePassCallback](
|
||||||
StringRef Pass, llvm::Any Ir) {
|
StringRef Pass, llvm::Any Ir) {
|
||||||
std::string PassName = Pass.str();
|
std::string PassName = Pass.str();
|
||||||
|
@ -700,6 +720,7 @@ void LLVMSelfProfileInitializeCallbacks(
|
||||||
[LlvmSelfProfiler, AfterPassCallback](StringRef Pass) {
|
[LlvmSelfProfiler, AfterPassCallback](StringRef Pass) {
|
||||||
AfterPassCallback(LlvmSelfProfiler);
|
AfterPassCallback(LlvmSelfProfiler);
|
||||||
});
|
});
|
||||||
|
#endif
|
||||||
|
|
||||||
PIC.registerBeforeAnalysisCallback([LlvmSelfProfiler, BeforePassCallback](
|
PIC.registerBeforeAnalysisCallback([LlvmSelfProfiler, BeforePassCallback](
|
||||||
StringRef Pass, llvm::Any Ir) {
|
StringRef Pass, llvm::Any Ir) {
|
||||||
|
@ -760,8 +781,15 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
PTO.LoopVectorization = LoopVectorize;
|
PTO.LoopVectorization = LoopVectorize;
|
||||||
PTO.SLPVectorization = SLPVectorize;
|
PTO.SLPVectorization = SLPVectorize;
|
||||||
|
|
||||||
|
// FIXME: We may want to expose this as an option.
|
||||||
|
bool DebugPassManager = false;
|
||||||
|
|
||||||
PassInstrumentationCallbacks PIC;
|
PassInstrumentationCallbacks PIC;
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
StandardInstrumentations SI(DebugPassManager);
|
||||||
|
#else
|
||||||
StandardInstrumentations SI;
|
StandardInstrumentations SI;
|
||||||
|
#endif
|
||||||
SI.registerCallbacks(PIC);
|
SI.registerCallbacks(PIC);
|
||||||
|
|
||||||
if (LlvmSelfProfiler){
|
if (LlvmSelfProfiler){
|
||||||
|
@ -777,10 +805,12 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
PGOOpt = PGOOptions(PGOUsePath, "", "", PGOOptions::IRUse);
|
PGOOpt = PGOOptions(PGOUsePath, "", "", PGOOptions::IRUse);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
PassBuilder PB(DebugPassManager, TM, PTO, PGOOpt, &PIC);
|
||||||
|
#else
|
||||||
PassBuilder PB(TM, PTO, PGOOpt, &PIC);
|
PassBuilder PB(TM, PTO, PGOOpt, &PIC);
|
||||||
|
#endif
|
||||||
|
|
||||||
// FIXME: We may want to expose this as an option.
|
|
||||||
bool DebugPassManager = false;
|
|
||||||
LoopAnalysisManager LAM(DebugPassManager);
|
LoopAnalysisManager LAM(DebugPassManager);
|
||||||
FunctionAnalysisManager FAM(DebugPassManager);
|
FunctionAnalysisManager FAM(DebugPassManager);
|
||||||
CGSCCAnalysisManager CGAM(DebugPassManager);
|
CGSCCAnalysisManager CGAM(DebugPassManager);
|
||||||
|
@ -802,7 +832,8 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
|
|
||||||
// We manually collect pipeline callbacks so we can apply them at O0, where the
|
// We manually collect pipeline callbacks so we can apply them at O0, where the
|
||||||
// PassBuilder does not create a pipeline.
|
// PassBuilder does not create a pipeline.
|
||||||
std::vector<std::function<void(ModulePassManager &)>> PipelineStartEPCallbacks;
|
std::vector<std::function<void(ModulePassManager &, PassBuilder::OptimizationLevel)>>
|
||||||
|
PipelineStartEPCallbacks;
|
||||||
#if LLVM_VERSION_GE(11, 0)
|
#if LLVM_VERSION_GE(11, 0)
|
||||||
std::vector<std::function<void(ModulePassManager &, PassBuilder::OptimizationLevel)>>
|
std::vector<std::function<void(ModulePassManager &, PassBuilder::OptimizationLevel)>>
|
||||||
OptimizerLastEPCallbacks;
|
OptimizerLastEPCallbacks;
|
||||||
|
@ -812,9 +843,11 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (VerifyIR) {
|
if (VerifyIR) {
|
||||||
PipelineStartEPCallbacks.push_back([VerifyIR](ModulePassManager &MPM) {
|
PipelineStartEPCallbacks.push_back(
|
||||||
|
[VerifyIR](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
|
||||||
MPM.addPass(VerifierPass());
|
MPM.addPass(VerifierPass());
|
||||||
});
|
}
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SanitizerOptions) {
|
if (SanitizerOptions) {
|
||||||
|
@ -832,9 +865,11 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
#if LLVM_VERSION_GE(10, 0)
|
#if LLVM_VERSION_GE(10, 0)
|
||||||
PipelineStartEPCallbacks.push_back([Options](ModulePassManager &MPM) {
|
PipelineStartEPCallbacks.push_back(
|
||||||
MPM.addPass(MemorySanitizerPass(Options));
|
[Options](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
|
||||||
});
|
MPM.addPass(MemorySanitizerPass(Options));
|
||||||
|
}
|
||||||
|
);
|
||||||
#endif
|
#endif
|
||||||
OptimizerLastEPCallbacks.push_back(
|
OptimizerLastEPCallbacks.push_back(
|
||||||
[Options](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
[Options](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
||||||
|
@ -854,9 +889,11 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
#if LLVM_VERSION_GE(10, 0)
|
#if LLVM_VERSION_GE(10, 0)
|
||||||
PipelineStartEPCallbacks.push_back([](ModulePassManager &MPM) {
|
PipelineStartEPCallbacks.push_back(
|
||||||
MPM.addPass(ThreadSanitizerPass());
|
[](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
|
||||||
});
|
MPM.addPass(ThreadSanitizerPass());
|
||||||
|
}
|
||||||
|
);
|
||||||
#endif
|
#endif
|
||||||
OptimizerLastEPCallbacks.push_back(
|
OptimizerLastEPCallbacks.push_back(
|
||||||
[](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
[](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
||||||
|
@ -879,9 +916,11 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
PipelineStartEPCallbacks.push_back([&](ModulePassManager &MPM) {
|
PipelineStartEPCallbacks.push_back(
|
||||||
MPM.addPass(RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
|
[&](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
|
||||||
});
|
MPM.addPass(RequireAnalysisPass<ASanGlobalsMetadataAnalysis, Module>());
|
||||||
|
}
|
||||||
|
);
|
||||||
OptimizerLastEPCallbacks.push_back(
|
OptimizerLastEPCallbacks.push_back(
|
||||||
[SanitizerOptions](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
[SanitizerOptions](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) {
|
||||||
FPM.addPass(AddressSanitizerPass(
|
FPM.addPass(AddressSanitizerPass(
|
||||||
|
@ -890,7 +929,7 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
PipelineStartEPCallbacks.push_back(
|
PipelineStartEPCallbacks.push_back(
|
||||||
[SanitizerOptions](ModulePassManager &MPM) {
|
[SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
|
||||||
MPM.addPass(ModuleAddressSanitizerPass(
|
MPM.addPass(ModuleAddressSanitizerPass(
|
||||||
/*CompileKernel=*/false, SanitizerOptions->SanitizeAddressRecover));
|
/*CompileKernel=*/false, SanitizerOptions->SanitizeAddressRecover));
|
||||||
}
|
}
|
||||||
|
@ -907,7 +946,7 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
);
|
);
|
||||||
#else
|
#else
|
||||||
PipelineStartEPCallbacks.push_back(
|
PipelineStartEPCallbacks.push_back(
|
||||||
[SanitizerOptions](ModulePassManager &MPM) {
|
[SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) {
|
||||||
MPM.addPass(HWAddressSanitizerPass(
|
MPM.addPass(HWAddressSanitizerPass(
|
||||||
/*CompileKernel=*/false, SanitizerOptions->SanitizeHWAddressRecover));
|
/*CompileKernel=*/false, SanitizerOptions->SanitizeHWAddressRecover));
|
||||||
}
|
}
|
||||||
|
@ -917,35 +956,53 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
}
|
}
|
||||||
|
|
||||||
ModulePassManager MPM(DebugPassManager);
|
ModulePassManager MPM(DebugPassManager);
|
||||||
|
bool NeedThinLTOBufferPasses = UseThinLTOBuffers;
|
||||||
if (!NoPrepopulatePasses) {
|
if (!NoPrepopulatePasses) {
|
||||||
if (OptLevel == PassBuilder::OptimizationLevel::O0) {
|
if (OptLevel == PassBuilder::OptimizationLevel::O0) {
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
for (const auto &C : PipelineStartEPCallbacks)
|
for (const auto &C : PipelineStartEPCallbacks)
|
||||||
C(MPM);
|
PB.registerPipelineStartEPCallback(C);
|
||||||
|
for (const auto &C : OptimizerLastEPCallbacks)
|
||||||
|
PB.registerOptimizerLastEPCallback(C);
|
||||||
|
|
||||||
#if LLVM_VERSION_GE(11, 0)
|
// Pass false as we manually schedule ThinLTOBufferPasses below.
|
||||||
|
MPM = PB.buildO0DefaultPipeline(OptLevel, /* PreLinkLTO */ false);
|
||||||
|
#else
|
||||||
|
for (const auto &C : PipelineStartEPCallbacks)
|
||||||
|
C(MPM, OptLevel);
|
||||||
|
|
||||||
|
# if LLVM_VERSION_GE(11, 0)
|
||||||
for (const auto &C : OptimizerLastEPCallbacks)
|
for (const auto &C : OptimizerLastEPCallbacks)
|
||||||
C(MPM, OptLevel);
|
C(MPM, OptLevel);
|
||||||
#else
|
# else
|
||||||
if (!OptimizerLastEPCallbacks.empty()) {
|
if (!OptimizerLastEPCallbacks.empty()) {
|
||||||
FunctionPassManager FPM(DebugPassManager);
|
FunctionPassManager FPM(DebugPassManager);
|
||||||
for (const auto &C : OptimizerLastEPCallbacks)
|
for (const auto &C : OptimizerLastEPCallbacks)
|
||||||
C(FPM, OptLevel);
|
C(FPM, OptLevel);
|
||||||
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
|
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM)));
|
||||||
}
|
}
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
MPM.addPass(AlwaysInlinerPass(EmitLifetimeMarkers));
|
MPM.addPass(AlwaysInlinerPass(EmitLifetimeMarkers));
|
||||||
|
|
||||||
#if LLVM_VERSION_GE(10, 0)
|
# if LLVM_VERSION_GE(10, 0)
|
||||||
if (PGOOpt) {
|
if (PGOOpt) {
|
||||||
PB.addPGOInstrPassesForO0(
|
PB.addPGOInstrPassesForO0(
|
||||||
MPM, DebugPassManager, PGOOpt->Action == PGOOptions::IRInstr,
|
MPM, DebugPassManager, PGOOpt->Action == PGOOptions::IRInstr,
|
||||||
/*IsCS=*/false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
|
/*IsCS=*/false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile);
|
||||||
}
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
} else {
|
} else {
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
for (const auto &C : PipelineStartEPCallbacks)
|
for (const auto &C : PipelineStartEPCallbacks)
|
||||||
PB.registerPipelineStartEPCallback(C);
|
PB.registerPipelineStartEPCallback(C);
|
||||||
|
#else
|
||||||
|
for (const auto &C : PipelineStartEPCallbacks)
|
||||||
|
PB.registerPipelineStartEPCallback([C, OptLevel](ModulePassManager &MPM) {
|
||||||
|
C(MPM, OptLevel);
|
||||||
|
});
|
||||||
|
#endif
|
||||||
if (OptStage != LLVMRustOptStage::PreLinkThinLTO) {
|
if (OptStage != LLVMRustOptStage::PreLinkThinLTO) {
|
||||||
for (const auto &C : OptimizerLastEPCallbacks)
|
for (const auto &C : OptimizerLastEPCallbacks)
|
||||||
PB.registerOptimizerLastEPCallback(C);
|
PB.registerOptimizerLastEPCallback(C);
|
||||||
|
@ -956,7 +1013,17 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
MPM = PB.buildPerModuleDefaultPipeline(OptLevel, DebugPassManager);
|
MPM = PB.buildPerModuleDefaultPipeline(OptLevel, DebugPassManager);
|
||||||
break;
|
break;
|
||||||
case LLVMRustOptStage::PreLinkThinLTO:
|
case LLVMRustOptStage::PreLinkThinLTO:
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel);
|
||||||
|
// The ThinLTOPreLink pipeline already includes ThinLTOBuffer passes. However, callback
|
||||||
|
// passes may still run afterwards. This means we need to run the buffer passes again.
|
||||||
|
// FIXME: In LLVM 13, the ThinLTOPreLink pipeline also runs OptimizerLastEPCallbacks
|
||||||
|
// before the RequiredLTOPreLinkPasses, in which case we can remove these hacks.
|
||||||
|
if (OptimizerLastEPCallbacks.empty())
|
||||||
|
NeedThinLTOBufferPasses = false;
|
||||||
|
#else
|
||||||
MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel, DebugPassManager);
|
MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel, DebugPassManager);
|
||||||
|
#endif
|
||||||
#if LLVM_VERSION_GE(11, 0)
|
#if LLVM_VERSION_GE(11, 0)
|
||||||
for (const auto &C : OptimizerLastEPCallbacks)
|
for (const auto &C : OptimizerLastEPCallbacks)
|
||||||
C(MPM, OptLevel);
|
C(MPM, OptLevel);
|
||||||
|
@ -970,21 +1037,34 @@ LLVMRustOptimizeWithNewPassManager(
|
||||||
#endif
|
#endif
|
||||||
break;
|
break;
|
||||||
case LLVMRustOptStage::PreLinkFatLTO:
|
case LLVMRustOptStage::PreLinkFatLTO:
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
MPM = PB.buildLTOPreLinkDefaultPipeline(OptLevel);
|
||||||
|
NeedThinLTOBufferPasses = false;
|
||||||
|
#else
|
||||||
MPM = PB.buildLTOPreLinkDefaultPipeline(OptLevel, DebugPassManager);
|
MPM = PB.buildLTOPreLinkDefaultPipeline(OptLevel, DebugPassManager);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case LLVMRustOptStage::ThinLTO:
|
case LLVMRustOptStage::ThinLTO:
|
||||||
// FIXME: Does it make sense to pass the ModuleSummaryIndex?
|
// FIXME: Does it make sense to pass the ModuleSummaryIndex?
|
||||||
// It only seems to be needed for C++ specific optimizations.
|
// It only seems to be needed for C++ specific optimizations.
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
MPM = PB.buildThinLTODefaultPipeline(OptLevel, nullptr);
|
||||||
|
#else
|
||||||
MPM = PB.buildThinLTODefaultPipeline(OptLevel, DebugPassManager, nullptr);
|
MPM = PB.buildThinLTODefaultPipeline(OptLevel, DebugPassManager, nullptr);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
case LLVMRustOptStage::FatLTO:
|
case LLVMRustOptStage::FatLTO:
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
MPM = PB.buildLTODefaultPipeline(OptLevel, nullptr);
|
||||||
|
#else
|
||||||
MPM = PB.buildLTODefaultPipeline(OptLevel, DebugPassManager, nullptr);
|
MPM = PB.buildLTODefaultPipeline(OptLevel, DebugPassManager, nullptr);
|
||||||
|
#endif
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (UseThinLTOBuffers) {
|
if (NeedThinLTOBufferPasses) {
|
||||||
MPM.addPass(CanonicalizeAliasesPass());
|
MPM.addPass(CanonicalizeAliasesPass());
|
||||||
MPM.addPass(NameAnonGlobalPass());
|
MPM.addPass(NameAnonGlobalPass());
|
||||||
}
|
}
|
||||||
|
|
|
@ -207,6 +207,8 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) {
|
||||||
return Attribute::InaccessibleMemOnly;
|
return Attribute::InaccessibleMemOnly;
|
||||||
case SanitizeHWAddress:
|
case SanitizeHWAddress:
|
||||||
return Attribute::SanitizeHWAddress;
|
return Attribute::SanitizeHWAddress;
|
||||||
|
case WillReturn:
|
||||||
|
return Attribute::WillReturn;
|
||||||
}
|
}
|
||||||
report_fatal_error("bad AttributeKind");
|
report_fatal_error("bad AttributeKind");
|
||||||
}
|
}
|
||||||
|
@ -263,6 +265,17 @@ extern "C" void LLVMRustAddByValCallSiteAttr(LLVMValueRef Instr, unsigned Index,
|
||||||
Call->addAttribute(Index, Attr);
|
Call->addAttribute(Index, Attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" void LLVMRustAddStructRetCallSiteAttr(LLVMValueRef Instr, unsigned Index,
|
||||||
|
LLVMTypeRef Ty) {
|
||||||
|
CallBase *Call = unwrap<CallBase>(Instr);
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
Attribute Attr = Attribute::getWithStructRetType(Call->getContext(), unwrap(Ty));
|
||||||
|
#else
|
||||||
|
Attribute Attr = Attribute::get(Call->getContext(), Attribute::StructRet);
|
||||||
|
#endif
|
||||||
|
Call->addAttribute(Index, Attr);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" void LLVMRustAddFunctionAttribute(LLVMValueRef Fn, unsigned Index,
|
extern "C" void LLVMRustAddFunctionAttribute(LLVMValueRef Fn, unsigned Index,
|
||||||
LLVMRustAttribute RustAttr) {
|
LLVMRustAttribute RustAttr) {
|
||||||
Function *A = unwrap<Function>(Fn);
|
Function *A = unwrap<Function>(Fn);
|
||||||
|
@ -304,6 +317,17 @@ extern "C" void LLVMRustAddByValAttr(LLVMValueRef Fn, unsigned Index,
|
||||||
F->addAttribute(Index, Attr);
|
F->addAttribute(Index, Attr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern "C" void LLVMRustAddStructRetAttr(LLVMValueRef Fn, unsigned Index,
|
||||||
|
LLVMTypeRef Ty) {
|
||||||
|
Function *F = unwrap<Function>(Fn);
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
Attribute Attr = Attribute::getWithStructRetType(F->getContext(), unwrap(Ty));
|
||||||
|
#else
|
||||||
|
Attribute Attr = Attribute::get(F->getContext(), Attribute::StructRet);
|
||||||
|
#endif
|
||||||
|
F->addAttribute(Index, Attr);
|
||||||
|
}
|
||||||
|
|
||||||
extern "C" void LLVMRustAddFunctionAttrStringValue(LLVMValueRef Fn,
|
extern "C" void LLVMRustAddFunctionAttrStringValue(LLVMValueRef Fn,
|
||||||
unsigned Index,
|
unsigned Index,
|
||||||
const char *Name,
|
const char *Name,
|
||||||
|
@ -1007,12 +1031,19 @@ LLVMRustDICompositeTypeReplaceArrays(LLVMRustDIBuilderRef Builder,
|
||||||
|
|
||||||
extern "C" LLVMMetadataRef
|
extern "C" LLVMMetadataRef
|
||||||
LLVMRustDIBuilderCreateDebugLocation(unsigned Line, unsigned Column,
|
LLVMRustDIBuilderCreateDebugLocation(unsigned Line, unsigned Column,
|
||||||
LLVMMetadataRef Scope,
|
LLVMMetadataRef ScopeRef,
|
||||||
LLVMMetadataRef InlinedAt) {
|
LLVMMetadataRef InlinedAt) {
|
||||||
DebugLoc debug_loc = DebugLoc::get(Line, Column, unwrapDIPtr<MDNode>(Scope),
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
MDNode *Scope = unwrapDIPtr<MDNode>(ScopeRef);
|
||||||
|
DILocation *Loc = DILocation::get(
|
||||||
|
Scope->getContext(), Line, Column, Scope,
|
||||||
|
unwrapDIPtr<MDNode>(InlinedAt));
|
||||||
|
return wrap(Loc);
|
||||||
|
#else
|
||||||
|
DebugLoc debug_loc = DebugLoc::get(Line, Column, unwrapDIPtr<MDNode>(ScopeRef),
|
||||||
unwrapDIPtr<MDNode>(InlinedAt));
|
unwrapDIPtr<MDNode>(InlinedAt));
|
||||||
|
|
||||||
return wrap(debug_loc.getAsMDNode());
|
return wrap(debug_loc.getAsMDNode());
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" int64_t LLVMRustDIBuilderCreateOpDeref() {
|
extern "C" int64_t LLVMRustDIBuilderCreateOpDeref() {
|
||||||
|
@ -1262,6 +1293,10 @@ extern "C" LLVMTypeKind LLVMRustGetTypeKind(LLVMTypeRef Ty) {
|
||||||
return LLVMScalableVectorTypeKind;
|
return LLVMScalableVectorTypeKind;
|
||||||
case Type::BFloatTyID:
|
case Type::BFloatTyID:
|
||||||
return LLVMBFloatTypeKind;
|
return LLVMBFloatTypeKind;
|
||||||
|
#endif
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
case Type::X86_AMXTyID:
|
||||||
|
return LLVMX86_AMXTypeKind;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
report_fatal_error("Unhandled TypeID.");
|
report_fatal_error("Unhandled TypeID.");
|
||||||
|
@ -1708,11 +1743,23 @@ LLVMRustBuildVectorReduceMax(LLVMBuilderRef B, LLVMValueRef Src, bool IsSigned)
|
||||||
}
|
}
|
||||||
extern "C" LLVMValueRef
|
extern "C" LLVMValueRef
|
||||||
LLVMRustBuildVectorReduceFMin(LLVMBuilderRef B, LLVMValueRef Src, bool NoNaN) {
|
LLVMRustBuildVectorReduceFMin(LLVMBuilderRef B, LLVMValueRef Src, bool NoNaN) {
|
||||||
return wrap(unwrap(B)->CreateFPMinReduce(unwrap(Src), NoNaN));
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
Instruction *I = unwrap(B)->CreateFPMinReduce(unwrap(Src));
|
||||||
|
I->setHasNoNaNs(NoNaN);
|
||||||
|
return wrap(I);
|
||||||
|
#else
|
||||||
|
return wrap(unwrap(B)->CreateFPMinReduce(unwrap(Src), NoNaN));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
extern "C" LLVMValueRef
|
extern "C" LLVMValueRef
|
||||||
LLVMRustBuildVectorReduceFMax(LLVMBuilderRef B, LLVMValueRef Src, bool NoNaN) {
|
LLVMRustBuildVectorReduceFMax(LLVMBuilderRef B, LLVMValueRef Src, bool NoNaN) {
|
||||||
|
#if LLVM_VERSION_GE(12, 0)
|
||||||
|
Instruction *I = unwrap(B)->CreateFPMaxReduce(unwrap(Src));
|
||||||
|
I->setHasNoNaNs(NoNaN);
|
||||||
|
return wrap(I);
|
||||||
|
#else
|
||||||
return wrap(unwrap(B)->CreateFPMaxReduce(unwrap(Src), NoNaN));
|
return wrap(unwrap(B)->CreateFPMaxReduce(unwrap(Src), NoNaN));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" LLVMValueRef
|
extern "C" LLVMValueRef
|
||||||
|
|
|
@ -603,6 +603,13 @@ impl<'a, Ty> FnAbi<'a, Ty> {
|
||||||
Ty: TyAndLayoutMethods<'a, C> + Copy,
|
Ty: TyAndLayoutMethods<'a, C> + Copy,
|
||||||
C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout + HasTargetSpec,
|
C: LayoutOf<Ty = Ty, TyAndLayout = TyAndLayout<'a, Ty>> + HasDataLayout + HasTargetSpec,
|
||||||
{
|
{
|
||||||
|
if abi == spec::abi::Abi::X86Interrupt {
|
||||||
|
if let Some(arg) = self.args.first_mut() {
|
||||||
|
arg.make_indirect_byval();
|
||||||
|
}
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
match &cx.target_spec().arch[..] {
|
match &cx.target_spec().arch[..] {
|
||||||
"x86" => {
|
"x86" => {
|
||||||
let flavor = if abi == spec::abi::Abi::Fastcall {
|
let flavor = if abi == spec::abi::Abi::Fastcall {
|
||||||
|
|
|
@ -14,7 +14,7 @@ pub fn target() -> Target {
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),
|
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),
|
||||||
pointer_width: 64,
|
pointer_width: 64,
|
||||||
data_layout: "E-m:e-i64:64-n32:64".to_string(),
|
data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(),
|
||||||
arch: "powerpc64".to_string(),
|
arch: "powerpc64".to_string(),
|
||||||
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ pub fn target() -> Target {
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "powerpc64-unknown-linux-musl".to_string(),
|
llvm_target: "powerpc64-unknown-linux-musl".to_string(),
|
||||||
pointer_width: 64,
|
pointer_width: 64,
|
||||||
data_layout: "E-m:e-i64:64-n32:64".to_string(),
|
data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(),
|
||||||
arch: "powerpc64".to_string(),
|
arch: "powerpc64".to_string(),
|
||||||
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base },
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,7 +10,7 @@ pub fn target() -> Target {
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),
|
llvm_target: "powerpc64-unknown-linux-gnu".to_string(),
|
||||||
pointer_width: 64,
|
pointer_width: 64,
|
||||||
data_layout: "E-m:e-i64:64-n32:64".to_string(),
|
data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(),
|
||||||
arch: "powerpc64".to_string(),
|
arch: "powerpc64".to_string(),
|
||||||
options: TargetOptions { endian: Endian::Big, ..base },
|
options: TargetOptions { endian: Endian::Big, ..base },
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ pub fn target() -> Target {
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "powerpc64le-unknown-linux-gnu".to_string(),
|
llvm_target: "powerpc64le-unknown-linux-gnu".to_string(),
|
||||||
pointer_width: 64,
|
pointer_width: 64,
|
||||||
data_layout: "e-m:e-i64:64-n32:64".to_string(),
|
data_layout: "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(),
|
||||||
arch: "powerpc64".to_string(),
|
arch: "powerpc64".to_string(),
|
||||||
options: TargetOptions { mcount: "_mcount".to_string(), ..base },
|
options: TargetOptions { mcount: "_mcount".to_string(), ..base },
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,7 @@ pub fn target() -> Target {
|
||||||
Target {
|
Target {
|
||||||
llvm_target: "powerpc64le-unknown-linux-musl".to_string(),
|
llvm_target: "powerpc64le-unknown-linux-musl".to_string(),
|
||||||
pointer_width: 64,
|
pointer_width: 64,
|
||||||
data_layout: "e-m:e-i64:64-n32:64".to_string(),
|
data_layout: "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(),
|
||||||
arch: "powerpc64".to_string(),
|
arch: "powerpc64".to_string(),
|
||||||
options: TargetOptions { mcount: "_mcount".to_string(), ..base },
|
options: TargetOptions { mcount: "_mcount".to_string(), ..base },
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ fn main() {
|
||||||
"InstrProfilingPlatformWindows.c",
|
"InstrProfilingPlatformWindows.c",
|
||||||
"InstrProfilingUtil.c",
|
"InstrProfilingUtil.c",
|
||||||
"InstrProfilingValue.c",
|
"InstrProfilingValue.c",
|
||||||
|
"InstrProfilingVersionVar.c",
|
||||||
"InstrProfilingWriter.c",
|
"InstrProfilingWriter.c",
|
||||||
// This file was renamed in LLVM 10.
|
// This file was renamed in LLVM 10.
|
||||||
"InstrProfilingRuntime.cc",
|
"InstrProfilingRuntime.cc",
|
||||||
|
|
|
@ -383,6 +383,8 @@ fn configure_cmake(
|
||||||
cfg.define("CMAKE_SYSTEM_NAME", "Windows");
|
cfg.define("CMAKE_SYSTEM_NAME", "Windows");
|
||||||
} else if target.contains("haiku") {
|
} else if target.contains("haiku") {
|
||||||
cfg.define("CMAKE_SYSTEM_NAME", "Haiku");
|
cfg.define("CMAKE_SYSTEM_NAME", "Haiku");
|
||||||
|
} else if target.contains("solaris") || target.contains("illumos") {
|
||||||
|
cfg.define("CMAKE_SYSTEM_NAME", "SunOS");
|
||||||
}
|
}
|
||||||
// When cross-compiling we should also set CMAKE_SYSTEM_VERSION, but in
|
// When cross-compiling we should also set CMAKE_SYSTEM_VERSION, but in
|
||||||
// that case like CMake we cannot easily determine system version either.
|
// that case like CMake we cannot easily determine system version either.
|
||||||
|
|
|
@ -36,5 +36,8 @@ ENV SCRIPT python3 ../x.py --stage 2 test --host='' --target $TARGETS
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
COPY scripts/android-start-emulator.sh /scripts/
|
COPY scripts/android-start-emulator.sh /scripts/
|
||||||
ENTRYPOINT ["/scripts/android-start-emulator.sh"]
|
ENTRYPOINT ["/scripts/android-start-emulator.sh"]
|
||||||
|
|
|
@ -24,6 +24,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/aarch64-unknown-linux-gnueabi/bin
|
ENV PATH=$PATH:/x-tools/aarch64-unknown-linux-gnueabi/bin
|
||||||
|
|
||||||
ENV CC_aarch64_unknown_linux_gnu=aarch64-unknown-linux-gnueabi-gcc \
|
ENV CC_aarch64_unknown_linux_gnu=aarch64-unknown-linux-gnueabi-gcc \
|
||||||
|
|
|
@ -36,3 +36,6 @@ ENV SCRIPT python3 ../x.py dist --host='' --target $TARGETS
|
||||||
|
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
|
@ -27,6 +27,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/arm-unknown-linux-gnueabi/bin
|
ENV PATH=$PATH:/x-tools/arm-unknown-linux-gnueabi/bin
|
||||||
|
|
||||||
ENV CC_arm_unknown_linux_gnueabi=arm-unknown-linux-gnueabi-gcc \
|
ENV CC_arm_unknown_linux_gnueabi=arm-unknown-linux-gnueabi-gcc \
|
||||||
|
|
|
@ -19,6 +19,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/arm-unknown-linux-gnueabihf/bin
|
ENV PATH=$PATH:/x-tools/arm-unknown-linux-gnueabihf/bin
|
||||||
|
|
||||||
ENV CC_arm_unknown_linux_gnueabihf=arm-unknown-linux-gnueabihf-gcc \
|
ENV CC_arm_unknown_linux_gnueabihf=arm-unknown-linux-gnueabihf-gcc \
|
||||||
|
|
|
@ -19,6 +19,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/armv7-unknown-linux-gnueabihf/bin
|
ENV PATH=$PATH:/x-tools/armv7-unknown-linux-gnueabihf/bin
|
||||||
|
|
||||||
ENV CC_armv7_unknown_linux_gnueabihf=armv7-unknown-linux-gnueabihf-gcc \
|
ENV CC_armv7_unknown_linux_gnueabihf=armv7-unknown-linux-gnueabihf-gcc \
|
||||||
|
|
|
@ -30,6 +30,9 @@ RUN CC=gcc CFLAGS="-m32 -Wa,-mrelax-relocations=no" \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS \
|
ENV RUST_CONFIGURE_ARGS \
|
||||||
--musl-root-i586=/musl-i586 \
|
--musl-root-i586=/musl-i586 \
|
||||||
--musl-root-i686=/musl-i686 \
|
--musl-root-i686=/musl-i686 \
|
||||||
|
|
|
@ -68,11 +68,13 @@ RUN ./build-binutils.sh
|
||||||
COPY host-x86_64/dist-x86_64-linux/build-gcc.sh /tmp/
|
COPY host-x86_64/dist-x86_64-linux/build-gcc.sh /tmp/
|
||||||
RUN ./build-gcc.sh && apt-get remove -y gcc g++
|
RUN ./build-gcc.sh && apt-get remove -y gcc g++
|
||||||
|
|
||||||
# Debian 6 has Python 2.6 by default, but LLVM needs 2.7+
|
|
||||||
COPY host-x86_64/dist-x86_64-linux/build-python.sh /tmp/
|
COPY host-x86_64/dist-x86_64-linux/build-python.sh /tmp/
|
||||||
RUN ./build-python.sh
|
# Build Python 2.7 needed for Clang 10.
|
||||||
|
RUN ./build-python.sh 2.7.12
|
||||||
|
# Build Python 3 needed for LLVM 12.
|
||||||
|
RUN ./build-python.sh 3.9.1
|
||||||
|
|
||||||
# LLVM needs cmake 3.4.3 or higher, and is planning to raise to 3.13.4.
|
# LLVM needs cmake 3.13.4 or higher.
|
||||||
COPY host-x86_64/dist-x86_64-linux/build-cmake.sh /tmp/
|
COPY host-x86_64/dist-x86_64-linux/build-cmake.sh /tmp/
|
||||||
RUN ./build-cmake.sh
|
RUN ./build-cmake.sh
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV HOSTS=mips-unknown-linux-gnu
|
ENV HOSTS=mips-unknown-linux-gnu
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
||||||
|
|
|
@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV HOSTS=mips64-unknown-linux-gnuabi64
|
ENV HOSTS=mips64-unknown-linux-gnuabi64
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
||||||
|
|
|
@ -21,6 +21,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV HOSTS=mips64el-unknown-linux-gnuabi64
|
ENV HOSTS=mips64el-unknown-linux-gnuabi64
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
||||||
|
|
|
@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV HOSTS=mipsel-unknown-linux-gnu
|
ENV HOSTS=mipsel-unknown-linux-gnu
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs
|
||||||
|
|
|
@ -25,6 +25,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/powerpc-unknown-linux-gnu/bin
|
ENV PATH=$PATH:/x-tools/powerpc-unknown-linux-gnu/bin
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
|
|
|
@ -26,6 +26,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/powerpc64-unknown-linux-gnu/bin
|
ENV PATH=$PATH:/x-tools/powerpc64-unknown-linux-gnu/bin
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
|
|
|
@ -25,6 +25,9 @@ RUN ./build-powerpc64le-toolchain.sh
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
AR_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-ar \
|
AR_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-ar \
|
||||||
CC_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-gcc \
|
CC_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-gcc \
|
||||||
|
|
|
@ -19,6 +19,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/riscv64-unknown-linux-gnu/bin
|
ENV PATH=$PATH:/x-tools/riscv64-unknown-linux-gnu/bin
|
||||||
|
|
||||||
ENV CC_riscv64gc_unknown_linux_gnu=riscv64-unknown-linux-gnu-gcc \
|
ENV CC_riscv64gc_unknown_linux_gnu=riscv64-unknown-linux-gnu-gcc \
|
||||||
|
|
|
@ -25,6 +25,9 @@ USER root
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/s390x-ibm-linux-gnu/bin
|
ENV PATH=$PATH:/x-tools/s390x-ibm-linux-gnu/bin
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
|
|
|
@ -23,6 +23,9 @@ RUN /tmp/freebsd-toolchain.sh x86_64
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
AR_x86_64_unknown_freebsd=x86_64-unknown-freebsd11-ar \
|
AR_x86_64_unknown_freebsd=x86_64-unknown-freebsd11-ar \
|
||||||
CC_x86_64_unknown_freebsd=x86_64-unknown-freebsd11-clang \
|
CC_x86_64_unknown_freebsd=x86_64-unknown-freebsd11-clang \
|
||||||
|
|
|
@ -22,6 +22,9 @@ RUN bash /tmp/illumos-toolchain.sh x86_64 gcc
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
AR_x86_64_unknown_illumos=x86_64-illumos-ar \
|
AR_x86_64_unknown_illumos=x86_64-illumos-ar \
|
||||||
CC_x86_64_unknown_illumos=x86_64-illumos-gcc \
|
CC_x86_64_unknown_illumos=x86_64-illumos-gcc \
|
||||||
|
|
|
@ -68,11 +68,13 @@ RUN ./build-binutils.sh
|
||||||
COPY host-x86_64/dist-x86_64-linux/build-gcc.sh /tmp/
|
COPY host-x86_64/dist-x86_64-linux/build-gcc.sh /tmp/
|
||||||
RUN ./build-gcc.sh && apt-get remove -y gcc g++
|
RUN ./build-gcc.sh && apt-get remove -y gcc g++
|
||||||
|
|
||||||
# Debian 6 has Python 2.6 by default, but LLVM needs 2.7+
|
|
||||||
COPY host-x86_64/dist-x86_64-linux/build-python.sh /tmp/
|
COPY host-x86_64/dist-x86_64-linux/build-python.sh /tmp/
|
||||||
RUN ./build-python.sh
|
# Build Python 2.7 needed for Clang 10.
|
||||||
|
RUN ./build-python.sh 2.7.12
|
||||||
|
# Build Python 3 needed for LLVM 12.
|
||||||
|
RUN ./build-python.sh 3.9.1
|
||||||
|
|
||||||
# LLVM needs cmake 3.4.3 or higher, and is planning to raise to 3.13.4.
|
# LLVM needs cmake 3.13.4 or higher.
|
||||||
COPY host-x86_64/dist-x86_64-linux/build-cmake.sh /tmp/
|
COPY host-x86_64/dist-x86_64-linux/build-cmake.sh /tmp/
|
||||||
RUN ./build-cmake.sh
|
RUN ./build-cmake.sh
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,8 @@
|
||||||
set -ex
|
set -ex
|
||||||
source shared.sh
|
source shared.sh
|
||||||
|
|
||||||
curl https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz | \
|
VERSION=$1
|
||||||
|
curl https://www.python.org/ftp/python/$VERSION/Python-$VERSION.tgz | \
|
||||||
tar xzf -
|
tar xzf -
|
||||||
|
|
||||||
mkdir python-build
|
mkdir python-build
|
||||||
|
@ -12,10 +13,10 @@ cd python-build
|
||||||
# Gotta do some hackery to tell python about our custom OpenSSL build, but other
|
# Gotta do some hackery to tell python about our custom OpenSSL build, but other
|
||||||
# than that fairly normal.
|
# than that fairly normal.
|
||||||
CFLAGS='-I /rustroot/include' LDFLAGS='-L /rustroot/lib -L /rustroot/lib64' \
|
CFLAGS='-I /rustroot/include' LDFLAGS='-L /rustroot/lib -L /rustroot/lib64' \
|
||||||
hide_output ../Python-2.7.12/configure --prefix=/rustroot
|
hide_output ../Python-$VERSION/configure --prefix=/rustroot
|
||||||
hide_output make -j10
|
hide_output make -j10
|
||||||
hide_output make install
|
hide_output make install
|
||||||
|
|
||||||
cd ..
|
cd ..
|
||||||
rm -rf python-build
|
rm -rf python-build
|
||||||
rm -rf Python-2.7.12
|
rm -rf Python-$VERSION
|
||||||
|
|
|
@ -20,6 +20,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
|
||||||
WORKDIR /build/
|
WORKDIR /build/
|
||||||
|
|
||||||
|
# Build cmake before musl toolchain, as we replace the compiler during that step.
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
COPY scripts/musl-toolchain.sh /build/
|
COPY scripts/musl-toolchain.sh /build/
|
||||||
# We need to mitigate rust-lang/rust#34978 when compiling musl itself as well
|
# We need to mitigate rust-lang/rust#34978 when compiling musl itself as well
|
||||||
RUN CFLAGS="-Wa,-mrelax-relocations=no -Wa,--compress-debug-sections=none -Wl,--compress-debug-sections=none" \
|
RUN CFLAGS="-Wa,-mrelax-relocations=no -Wa,--compress-debug-sections=none -Wl,--compress-debug-sections=none" \
|
||||||
|
|
|
@ -9,6 +9,9 @@ RUN /tmp/build-netbsd-toolchain.sh
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV PATH=$PATH:/x-tools/x86_64-unknown-netbsd/bin
|
ENV PATH=$PATH:/x-tools/x86_64-unknown-netbsd/bin
|
||||||
|
|
||||||
ENV \
|
ENV \
|
||||||
|
|
|
@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
RUN mkdir -p /config
|
RUN mkdir -p /config
|
||||||
RUN echo "[rust]" > /config/nopt-std-config.toml
|
RUN echo "[rust]" > /config/nopt-std-config.toml
|
||||||
RUN echo "optimize = false" >> /config/nopt-std-config.toml
|
RUN echo "optimize = false" >> /config/nopt-std-config.toml
|
||||||
|
|
|
@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --build=i686-unknown-linux-gnu
|
ENV RUST_CONFIGURE_ARGS --build=i686-unknown-linux-gnu
|
||||||
# Exclude some tests that are unlikely to be platform specific, to speed up
|
# Exclude some tests that are unlikely to be platform specific, to speed up
|
||||||
# this slow job.
|
# this slow job.
|
||||||
|
|
|
@ -42,5 +42,8 @@ RUN npm install browser-ui-test -g --unsafe-perm=true
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu
|
ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu
|
||||||
ENV RUST_CHECK_TARGET check-aux-and-gui
|
ENV RUST_CHECK_TARGET check-aux-and-gui
|
||||||
|
|
|
@ -19,6 +19,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu --set rust.ignore-git=false
|
ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu --set rust.ignore-git=false
|
||||||
ENV SCRIPT python3 ../x.py --stage 2 test distcheck
|
ENV SCRIPT python3 ../x.py --stage 2 test distcheck
|
||||||
ENV DIST_SRC 1
|
ENV DIST_SRC 1
|
||||||
|
|
|
@ -18,6 +18,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
COPY scripts/sccache.sh /scripts/
|
COPY scripts/sccache.sh /scripts/
|
||||||
RUN sh /scripts/sccache.sh
|
RUN sh /scripts/sccache.sh
|
||||||
|
|
||||||
|
COPY scripts/cmake.sh /scripts/
|
||||||
|
RUN /scripts/cmake.sh
|
||||||
|
|
||||||
COPY host-x86_64/x86_64-gnu-tools/checktools.sh /tmp/
|
COPY host-x86_64/x86_64-gnu-tools/checktools.sh /tmp/
|
||||||
|
|
||||||
ENV RUST_CONFIGURE_ARGS \
|
ENV RUST_CONFIGURE_ARGS \
|
||||||
|
|
34
src/ci/docker/scripts/cmake.sh
Executable file
34
src/ci/docker/scripts/cmake.sh
Executable file
|
@ -0,0 +1,34 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -ex
|
||||||
|
|
||||||
|
hide_output() {
|
||||||
|
set +x
|
||||||
|
on_err="
|
||||||
|
echo ERROR: An error was encountered with the build.
|
||||||
|
cat /tmp/build.log
|
||||||
|
exit 1
|
||||||
|
"
|
||||||
|
trap "$on_err" ERR
|
||||||
|
bash -c "while true; do sleep 30; echo \$(date) - building ...; done" &
|
||||||
|
PING_LOOP_PID=$!
|
||||||
|
"$@" &> /tmp/build.log
|
||||||
|
trap - ERR
|
||||||
|
kill $PING_LOOP_PID
|
||||||
|
rm /tmp/build.log
|
||||||
|
set -x
|
||||||
|
}
|
||||||
|
|
||||||
|
# LLVM 12 requires CMake 3.13.4 or higher.
|
||||||
|
# This script is not necessary for images using Ubuntu 20.04 or newer.
|
||||||
|
CMAKE=3.13.4
|
||||||
|
curl -L https://github.com/Kitware/CMake/releases/download/v$CMAKE/cmake-$CMAKE.tar.gz | tar xzf -
|
||||||
|
|
||||||
|
mkdir cmake-build
|
||||||
|
cd cmake-build
|
||||||
|
hide_output ../cmake-$CMAKE/configure
|
||||||
|
hide_output make -j$(nproc)
|
||||||
|
hide_output make install
|
||||||
|
|
||||||
|
cd ..
|
||||||
|
rm -rf cmake-build
|
||||||
|
rm -rf cmake-$CMAKE
|
|
@ -1 +1 @@
|
||||||
Subproject commit 96ae8953e4938d39c4173dd189f268459fff8c02
|
Subproject commit 40618a2340ac2939b3dc320a9fe1133fa5caa345
|
|
@ -5,6 +5,7 @@
|
||||||
//[riscv32] compile-flags: --target riscv32imac-unknown-none-elf
|
//[riscv32] compile-flags: --target riscv32imac-unknown-none-elf
|
||||||
// compile-flags: -C target-feature=+d
|
// compile-flags: -C target-feature=+d
|
||||||
// needs-llvm-components: riscv
|
// needs-llvm-components: riscv
|
||||||
|
// min-system-llvm-version: 12.0
|
||||||
|
|
||||||
#![feature(no_core, lang_items, rustc_attrs)]
|
#![feature(no_core, lang_items, rustc_attrs)]
|
||||||
#![crate_type = "rlib"]
|
#![crate_type = "rlib"]
|
||||||
|
@ -99,45 +100,45 @@ macro_rules! check_reg {
|
||||||
|
|
||||||
// CHECK-LABEL: reg_i8:
|
// CHECK-LABEL: reg_i8:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check!(reg_i8 i8 reg "mv");
|
check!(reg_i8 i8 reg "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: reg_i16:
|
// CHECK-LABEL: reg_i16:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check!(reg_i16 i16 reg "mv");
|
check!(reg_i16 i16 reg "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: reg_i32:
|
// CHECK-LABEL: reg_i32:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check!(reg_i32 i32 reg "mv");
|
check!(reg_i32 i32 reg "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: reg_f32:
|
// CHECK-LABEL: reg_f32:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check!(reg_f32 f32 reg "mv");
|
check!(reg_f32 f32 reg "mv");
|
||||||
|
|
||||||
// riscv64-LABEL: reg_i64:
|
// riscv64-LABEL: reg_i64:
|
||||||
// riscv64: #APP
|
// riscv64: #APP
|
||||||
// riscv64: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// riscv64: #NO_APP
|
// riscv64: #NO_APP
|
||||||
#[cfg(riscv64)]
|
#[cfg(riscv64)]
|
||||||
check!(reg_i64 i64 reg "mv");
|
check!(reg_i64 i64 reg "mv");
|
||||||
|
|
||||||
// riscv64-LABEL: reg_f64:
|
// riscv64-LABEL: reg_f64:
|
||||||
// riscv64: #APP
|
// riscv64: #APP
|
||||||
// riscv64: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// riscv64: #NO_APP
|
// riscv64: #NO_APP
|
||||||
#[cfg(riscv64)]
|
#[cfg(riscv64)]
|
||||||
check!(reg_f64 f64 reg "mv");
|
check!(reg_f64 f64 reg "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: reg_ptr:
|
// CHECK-LABEL: reg_ptr:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}}
|
// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}}
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check!(reg_ptr ptr reg "mv");
|
check!(reg_ptr ptr reg "mv");
|
||||||
|
|
||||||
|
@ -155,45 +156,45 @@ check!(freg_f64 f64 freg "fmv.d");
|
||||||
|
|
||||||
// CHECK-LABEL: a0_i8:
|
// CHECK-LABEL: a0_i8:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add a0, zero, a0
|
// CHECK: mv a0, a0
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check_reg!(a0_i8 i8 "a0" "mv");
|
check_reg!(a0_i8 i8 "a0" "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: a0_i16:
|
// CHECK-LABEL: a0_i16:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add a0, zero, a0
|
// CHECK: mv a0, a0
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check_reg!(a0_i16 i16 "a0" "mv");
|
check_reg!(a0_i16 i16 "a0" "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: a0_i32:
|
// CHECK-LABEL: a0_i32:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add a0, zero, a0
|
// CHECK: mv a0, a0
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check_reg!(a0_i32 i32 "a0" "mv");
|
check_reg!(a0_i32 i32 "a0" "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: a0_f32:
|
// CHECK-LABEL: a0_f32:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add a0, zero, a0
|
// CHECK: mv a0, a0
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check_reg!(a0_f32 f32 "a0" "mv");
|
check_reg!(a0_f32 f32 "a0" "mv");
|
||||||
|
|
||||||
// riscv64-LABEL: a0_i64:
|
// riscv64-LABEL: a0_i64:
|
||||||
// riscv64: #APP
|
// riscv64: #APP
|
||||||
// riscv64: add a0, zero, a0
|
// riscv64: mv a0, a0
|
||||||
// riscv64: #NO_APP
|
// riscv64: #NO_APP
|
||||||
#[cfg(riscv64)]
|
#[cfg(riscv64)]
|
||||||
check_reg!(a0_i64 i64 "a0" "mv");
|
check_reg!(a0_i64 i64 "a0" "mv");
|
||||||
|
|
||||||
// riscv64-LABEL: a0_f64:
|
// riscv64-LABEL: a0_f64:
|
||||||
// riscv64: #APP
|
// riscv64: #APP
|
||||||
// riscv64: add a0, zero, a0
|
// riscv64: mv a0, a0
|
||||||
// riscv64: #NO_APP
|
// riscv64: #NO_APP
|
||||||
#[cfg(riscv64)]
|
#[cfg(riscv64)]
|
||||||
check_reg!(a0_f64 f64 "a0" "mv");
|
check_reg!(a0_f64 f64 "a0" "mv");
|
||||||
|
|
||||||
// CHECK-LABEL: a0_ptr:
|
// CHECK-LABEL: a0_ptr:
|
||||||
// CHECK: #APP
|
// CHECK: #APP
|
||||||
// CHECK: add a0, zero, a0
|
// CHECK: mv a0, a0
|
||||||
// CHECK: #NO_APP
|
// CHECK: #NO_APP
|
||||||
check_reg!(a0_ptr ptr "a0" "mv");
|
check_reg!(a0_ptr ptr "a0" "mv");
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
// min-system-llvm-version: 12.0
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
#![feature(rustc_attrs)]
|
#![feature(rustc_attrs)]
|
||||||
|
@ -73,7 +74,7 @@ pub fn _box(x: Box<i32>) -> Box<i32> {
|
||||||
x
|
x
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: @struct_return(%S* noalias nocapture sret dereferenceable(32){{( %0)?}})
|
// CHECK: @struct_return(%S* noalias nocapture sret(%S) dereferenceable(32){{( %0)?}})
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn struct_return() -> S {
|
pub fn struct_return() -> S {
|
||||||
S {
|
S {
|
||||||
|
|
|
@ -52,7 +52,7 @@ pub struct BigPacked2 {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 {
|
pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 {
|
||||||
// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array
|
// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array
|
||||||
// CHECK: call void %{{.*}}(%Array* noalias nocapture sret dereferenceable(32) [[ALLOCA]])
|
// CHECK: call void %{{.*}}(%Array* noalias nocapture sret{{.*}} dereferenceable(32) [[ALLOCA]])
|
||||||
// CHECK: call void @llvm.memcpy.{{.*}}(i8* align 1 %{{.*}}, i8* align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false)
|
// CHECK: call void @llvm.memcpy.{{.*}}(i8* align 1 %{{.*}}, i8* align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false)
|
||||||
// check that calls whose destination is a field of a packed struct
|
// check that calls whose destination is a field of a packed struct
|
||||||
// go through an alloca rather than calling the function with an
|
// go through an alloca rather than calling the function with an
|
||||||
|
@ -64,7 +64,7 @@ pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 {
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub fn call_pkd2(f: fn() -> Array) -> BigPacked2 {
|
pub fn call_pkd2(f: fn() -> Array) -> BigPacked2 {
|
||||||
// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array
|
// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array
|
||||||
// CHECK: call void %{{.*}}(%Array* noalias nocapture sret dereferenceable(32) [[ALLOCA]])
|
// CHECK: call void %{{.*}}(%Array* noalias nocapture sret{{.*}} dereferenceable(32) [[ALLOCA]])
|
||||||
// CHECK: call void @llvm.memcpy.{{.*}}(i8* align 2 %{{.*}}, i8* align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false)
|
// CHECK: call void @llvm.memcpy.{{.*}}(i8* align 2 %{{.*}}, i8* align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false)
|
||||||
// check that calls whose destination is a field of a packed struct
|
// check that calls whose destination is a field of a packed struct
|
||||||
// go through an alloca rather than calling the function with an
|
// go through an alloca rather than calling the function with an
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
// ignore-tidy-linelength
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
// min-system-llvm-version: 9.0
|
// min-system-llvm-version: 12.0
|
||||||
// ignore-arm
|
// ignore-arm
|
||||||
// ignore-aarch64
|
// ignore-aarch64
|
||||||
// ignore-mips
|
// ignore-mips
|
||||||
|
@ -34,19 +34,19 @@ pub enum TeBigS {
|
||||||
Variant(BigS),
|
Variant(BigS),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], %BigS* [[BIGS_ARG_ATTRS1:.*]] byval(%BigS) [[BIGS_ARG_ATTRS2:.*]])
|
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], %BigS* [[BIGS_ARG_ATTRS1:.*]] byval(%BigS) [[BIGS_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_BigS(_: BigS) -> BigS { loop {} }
|
pub extern "C" fn test_BigS(_: BigS) -> BigS { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS]], %TsBigS* [[BIGS_ARG_ATTRS1]] byval(%TsBigS) [[BIGS_ARG_ATTRS2:.*]])
|
// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], %TsBigS* [[BIGS_ARG_ATTRS1]] byval(%TsBigS) [[BIGS_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} }
|
pub extern "C" fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS]], %TuBigS* [[BIGS_ARG_ATTRS1]] byval(%TuBigS) [[BIGS_ARG_ATTRS2:.*]])
|
// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], %TuBigS* [[BIGS_ARG_ATTRS1]] byval(%TuBigS) [[BIGS_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} }
|
pub extern "C" fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS]], %"TeBigS::Variant"* [[BIGS_ARG_ATTRS1]] byval(%"TeBigS::Variant") [[BIGS_ARG_ATTRS2]])
|
// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], %"TeBigS::Variant"* [[BIGS_ARG_ATTRS1]] byval(%"TeBigS::Variant") [[BIGS_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
pub extern "C" fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
||||||
|
|
||||||
|
@ -70,18 +70,18 @@ pub enum TeBigU {
|
||||||
Variant(BigU),
|
Variant(BigU),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], %BigU* [[BIGU_ARG_ATTRS1:.*]] byval(%BigU) [[BIGU_ARG_ATTRS2:.*]])
|
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], %BigU* [[BIGU_ARG_ATTRS1:.*]] byval(%BigU) [[BIGU_ARG_ATTRS2:.*]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_BigU(_: BigU) -> BigU { loop {} }
|
pub extern "C" fn test_BigU(_: BigU) -> BigU { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS:.*]], %TsBigU* [[BIGU_ARG_ATTRS1]] byval(%TsBigU) [[BIGU_ARG_ATTRS2]])
|
// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1:.*]] sret(%TsBigU) [[BIGU_RET_ATTRS2:.*]], %TsBigU* [[BIGU_ARG_ATTRS1]] byval(%TsBigU) [[BIGU_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} }
|
pub extern "C" fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS]], %TuBigU* [[BIGU_ARG_ATTRS1]] byval(%TuBigU) [[BIGU_ARG_ATTRS2]])
|
// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2:.*]], %TuBigU* [[BIGU_ARG_ATTRS1]] byval(%TuBigU) [[BIGU_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} }
|
pub extern "C" fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} }
|
||||||
|
|
||||||
// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS]], %"TeBigU::Variant"* [[BIGU_ARG_ATTRS1]] byval(%"TeBigU::Variant") [[BIGU_ARG_ATTRS2]])
|
// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2:.*]], %"TeBigU::Variant"* [[BIGU_ARG_ATTRS1]] byval(%"TeBigU::Variant") [[BIGU_ARG_ATTRS2]])
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
pub extern "C" fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
|
// min-system-llvm-version: 12.0
|
||||||
// ignore-aarch64
|
// ignore-aarch64
|
||||||
// ignore-emscripten
|
// ignore-emscripten
|
||||||
// ignore-mips64
|
// ignore-mips64
|
||||||
|
@ -36,19 +38,19 @@ pub enum TeBigS {
|
||||||
Variant(BigS),
|
Variant(BigS),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], [16 x i32]
|
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], [16 x i32]
|
||||||
#[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]], [16 x i32]
|
// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], [16 x i32]
|
||||||
#[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]], [16 x i32]
|
// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], [16 x i32]
|
||||||
#[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]], [16 x i32]
|
// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], [16 x i32]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
||||||
|
|
||||||
|
@ -72,18 +74,18 @@ pub enum TeBigU {
|
||||||
Variant(BigU),
|
Variant(BigU),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], [16 x i32]
|
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], [16 x i32]
|
||||||
#[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:.*]], [16 x i32]
|
// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1]] sret(%TsBigU) [[BIGU_RET_ATTRS2]], [16 x i32]
|
||||||
#[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]], [16 x i32]
|
// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2]], [16 x i32]
|
||||||
#[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]], [16 x i32]
|
// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2]], [16 x i32]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
// compile-flags: -C no-prepopulate-passes
|
// compile-flags: -C no-prepopulate-passes
|
||||||
|
// ignore-tidy-linelength
|
||||||
|
|
||||||
|
// min-system-llvm-version: 12.0
|
||||||
// only-mips64
|
// only-mips64
|
||||||
// See repr-transparent.rs
|
// See repr-transparent.rs
|
||||||
|
|
||||||
|
@ -25,19 +27,19 @@ pub enum TeBigS {
|
||||||
Variant(BigS),
|
Variant(BigS),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], [8 x i64]
|
// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], [8 x i64]
|
||||||
#[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]], [8 x i64]
|
// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], [8 x i64]
|
||||||
#[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]], [8 x i64]
|
// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], [8 x i64]
|
||||||
#[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]], [8 x i64]
|
// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], [8 x i64]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} }
|
||||||
|
|
||||||
|
@ -61,18 +63,18 @@ pub enum TeBigU {
|
||||||
Variant(BigU),
|
Variant(BigU),
|
||||||
}
|
}
|
||||||
|
|
||||||
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], [8 x i64]
|
// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], [8 x i64]
|
||||||
#[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:.*]], [8 x i64]
|
// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1]] sret(%TsBigU) [[BIGU_RET_ATTRS2]], [8 x i64]
|
||||||
#[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]], [8 x i64]
|
// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2]], [8 x i64]
|
||||||
#[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]], [8 x i64]
|
// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2]], [8 x i64]
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} }
|
||||||
|
|
|
@ -12,12 +12,11 @@
|
||||||
# `else` branch. Accordingly, we expect the function that is never called to
|
# `else` branch. Accordingly, we expect the function that is never called to
|
||||||
# be marked as cold.
|
# be marked as cold.
|
||||||
#
|
#
|
||||||
# The program is compiled with `-Copt-level=s` because this setting disables
|
# Disable the pre-inlining pass (i.e. a pass that does some inlining before
|
||||||
# LLVM's pre-inlining pass (i.e. a pass that does some inlining before it adds
|
# it adds the profiling instrumentation). Disabling this pass leads to
|
||||||
# the profiling instrumentation). Disabling this pass leads to rather
|
# rather predictable IR which we need for this test to be stable.
|
||||||
# predictable IR which we need for this test to be stable.
|
|
||||||
|
|
||||||
COMMON_FLAGS=-Copt-level=s -Ccodegen-units=1
|
COMMON_FLAGS=-Copt-level=2 -Ccodegen-units=1 -Cllvm-args=-disable-preinline
|
||||||
|
|
||||||
# LLVM doesn't support instrumenting binaries that use SEH:
|
# LLVM doesn't support instrumenting binaries that use SEH:
|
||||||
# https://github.com/rust-lang/rust/issues/61002
|
# https://github.com/rust-lang/rust/issues/61002
|
||||||
|
|
|
@ -4,6 +4,6 @@
|
||||||
# min-llvm-version: 11.0
|
# min-llvm-version: 11.0
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) -Z unstable-options -C split-debuginfo=packed foo.rs -g
|
$(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 foo.rs -g
|
||||||
rm $(TMPDIR)/foo.dwp
|
rm $(TMPDIR)/foo.dwp
|
||||||
rm $(TMPDIR)/$(call BIN,foo)
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue