summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_codegen_llvm/src/llvm
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:59:35 +0000
commitd1b2d29528b7794b41e66fc2136e395a02f8529b (patch)
treea4a17504b260206dec3cf55b2dca82929a348ac2 /compiler/rustc_codegen_llvm/src/llvm
parentReleasing progress-linux version 1.72.1+dfsg1-1~progress7.99u1. (diff)
downloadrustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.tar.xz
rustc-d1b2d29528b7794b41e66fc2136e395a02f8529b.zip
Merging upstream version 1.73.0+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/llvm')
-rw-r--r--compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs2
-rw-r--r--compiler/rustc_codegen_llvm/src/llvm/ffi.rs234
2 files changed, 27 insertions, 209 deletions
diff --git a/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs b/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs
index 45de284d2..06e846a2b 100644
--- a/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs
+++ b/compiler/rustc_codegen_llvm/src/llvm/diagnostic.rs
@@ -9,7 +9,7 @@ use libc::c_uint;
use super::{DiagnosticInfo, SMDiagnostic};
use rustc_span::InnerSpan;
-#[derive(Copy, Clone)]
+#[derive(Copy, Clone, Debug)]
pub enum OptimizationDiagnosticKind {
OptimizationRemark,
OptimizationMissed,
diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
index 3ad546b61..84157d1e2 100644
--- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
+++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs
@@ -1,8 +1,6 @@
#![allow(non_camel_case_types)]
#![allow(non_upper_case_globals)]
-use crate::coverageinfo::map_data as coverage_map;
-
use super::debuginfo::{
DIArray, DIBasicType, DIBuilder, DICompositeType, DIDerivedType, DIDescriptor, DIEnumerator,
DIFile, DIFlags, DIGlobalVariableExpression, DILexicalBlock, DILocation, DINameSpace,
@@ -477,6 +475,8 @@ pub enum OptStage {
pub struct SanitizerOptions {
pub sanitize_address: bool,
pub sanitize_address_recover: bool,
+ pub sanitize_cfi: bool,
+ pub sanitize_kcfi: bool,
pub sanitize_memory: bool,
pub sanitize_memory_recover: bool,
pub sanitize_memory_track_origins: c_int,
@@ -688,204 +688,6 @@ extern "C" {
pub type DiagnosticHandlerTy = unsafe extern "C" fn(&DiagnosticInfo, *mut c_void);
pub type InlineAsmDiagHandlerTy = unsafe extern "C" fn(&SMDiagnostic, *const c_void, c_uint);
-pub mod coverageinfo {
- use super::coverage_map;
-
- /// Corresponds to enum `llvm::coverage::CounterMappingRegion::RegionKind`.
- ///
- /// Must match the layout of `LLVMRustCounterMappingRegionKind`.
- #[derive(Copy, Clone, Debug)]
- #[repr(C)]
- pub enum RegionKind {
- /// A CodeRegion associates some code with a counter
- CodeRegion = 0,
-
- /// An ExpansionRegion represents a file expansion region that associates
- /// a source range with the expansion of a virtual source file, such as
- /// for a macro instantiation or #include file.
- ExpansionRegion = 1,
-
- /// A SkippedRegion represents a source range with code that was skipped
- /// by a preprocessor or similar means.
- SkippedRegion = 2,
-
- /// A GapRegion is like a CodeRegion, but its count is only set as the
- /// line execution count when its the only region in the line.
- GapRegion = 3,
-
- /// A BranchRegion represents leaf-level boolean expressions and is
- /// associated with two counters, each representing the number of times the
- /// expression evaluates to true or false.
- BranchRegion = 4,
- }
-
- /// This struct provides LLVM's representation of a "CoverageMappingRegion", encoded into the
- /// coverage map, in accordance with the
- /// [LLVM Code Coverage Mapping Format](https://github.com/rust-lang/llvm-project/blob/rustc/13.0-2021-09-30/llvm/docs/CoverageMappingFormat.rst#llvm-code-coverage-mapping-format).
- /// The struct composes fields representing the `Counter` type and value(s) (injected counter
- /// ID, or expression type and operands), the source file (an indirect index into a "filenames
- /// array", encoded separately), and source location (start and end positions of the represented
- /// code region).
- ///
- /// Corresponds to struct `llvm::coverage::CounterMappingRegion`.
- ///
- /// Must match the layout of `LLVMRustCounterMappingRegion`.
- #[derive(Copy, Clone, Debug)]
- #[repr(C)]
- pub struct CounterMappingRegion {
- /// The counter type and type-dependent counter data, if any.
- counter: coverage_map::Counter,
-
- /// If the `RegionKind` is a `BranchRegion`, this represents the counter
- /// for the false branch of the region.
- false_counter: coverage_map::Counter,
-
- /// An indirect reference to the source filename. In the LLVM Coverage Mapping Format, the
- /// file_id is an index into a function-specific `virtual_file_mapping` array of indexes
- /// that, in turn, are used to look up the filename for this region.
- file_id: u32,
-
- /// If the `RegionKind` is an `ExpansionRegion`, the `expanded_file_id` can be used to find
- /// the mapping regions created as a result of macro expansion, by checking if their file id
- /// matches the expanded file id.
- expanded_file_id: u32,
-
- /// 1-based starting line of the mapping region.
- start_line: u32,
-
- /// 1-based starting column of the mapping region.
- start_col: u32,
-
- /// 1-based ending line of the mapping region.
- end_line: u32,
-
- /// 1-based ending column of the mapping region. If the high bit is set, the current
- /// mapping region is a gap area.
- end_col: u32,
-
- kind: RegionKind,
- }
-
- impl CounterMappingRegion {
- pub(crate) fn code_region(
- counter: coverage_map::Counter,
- file_id: u32,
- start_line: u32,
- start_col: u32,
- end_line: u32,
- end_col: u32,
- ) -> Self {
- Self {
- counter,
- false_counter: coverage_map::Counter::zero(),
- file_id,
- expanded_file_id: 0,
- start_line,
- start_col,
- end_line,
- end_col,
- kind: RegionKind::CodeRegion,
- }
- }
-
- // This function might be used in the future; the LLVM API is still evolving, as is coverage
- // support.
- #[allow(dead_code)]
- pub(crate) fn branch_region(
- counter: coverage_map::Counter,
- false_counter: coverage_map::Counter,
- file_id: u32,
- start_line: u32,
- start_col: u32,
- end_line: u32,
- end_col: u32,
- ) -> Self {
- Self {
- counter,
- false_counter,
- file_id,
- expanded_file_id: 0,
- start_line,
- start_col,
- end_line,
- end_col,
- kind: RegionKind::BranchRegion,
- }
- }
-
- // This function might be used in the future; the LLVM API is still evolving, as is coverage
- // support.
- #[allow(dead_code)]
- pub(crate) fn expansion_region(
- file_id: u32,
- expanded_file_id: u32,
- start_line: u32,
- start_col: u32,
- end_line: u32,
- end_col: u32,
- ) -> Self {
- Self {
- counter: coverage_map::Counter::zero(),
- false_counter: coverage_map::Counter::zero(),
- file_id,
- expanded_file_id,
- start_line,
- start_col,
- end_line,
- end_col,
- kind: RegionKind::ExpansionRegion,
- }
- }
-
- // This function might be used in the future; the LLVM API is still evolving, as is coverage
- // support.
- #[allow(dead_code)]
- pub(crate) fn skipped_region(
- file_id: u32,
- start_line: u32,
- start_col: u32,
- end_line: u32,
- end_col: u32,
- ) -> Self {
- Self {
- counter: coverage_map::Counter::zero(),
- false_counter: coverage_map::Counter::zero(),
- file_id,
- expanded_file_id: 0,
- start_line,
- start_col,
- end_line,
- end_col,
- kind: RegionKind::SkippedRegion,
- }
- }
-
- // This function might be used in the future; the LLVM API is still evolving, as is coverage
- // support.
- #[allow(dead_code)]
- pub(crate) fn gap_region(
- counter: coverage_map::Counter,
- file_id: u32,
- start_line: u32,
- start_col: u32,
- end_line: u32,
- end_col: u32,
- ) -> Self {
- Self {
- counter,
- false_counter: coverage_map::Counter::zero(),
- file_id,
- expanded_file_id: 0,
- start_line,
- start_col,
- end_line,
- end_col: (1_u32 << 31) | end_col,
- kind: RegionKind::GapRegion,
- }
- }
- }
-}
-
pub mod debuginfo {
use super::{InvariantOpaque, Metadata};
use bitflags::bitflags;
@@ -1073,7 +875,7 @@ extern "C" {
// Operations on array, pointer, and vector types (sequence types)
pub fn LLVMRustArrayType(ElementType: &Type, ElementCount: u64) -> &Type;
- pub fn LLVMPointerType(ElementType: &Type, AddressSpace: c_uint) -> &Type;
+ pub fn LLVMPointerTypeInContext(C: &Context, AddressSpace: c_uint) -> &Type;
pub fn LLVMVectorType(ElementType: &Type, ElementCount: c_uint) -> &Type;
pub fn LLVMGetElementType(Ty: &Type) -> &Type;
@@ -1094,6 +896,7 @@ extern "C" {
pub fn LLVMRustGlobalAddMetadata<'a>(Val: &'a Value, KindID: c_uint, Metadata: &'a Metadata);
pub fn LLVMValueAsMetadata(Node: &Value) -> &Metadata;
pub fn LLVMIsAFunction(Val: &Value) -> Option<&Value>;
+ pub fn LLVMRustIsNonGVFunctionPointerTy(Val: &Value) -> bool;
// Operations on constants of any type
pub fn LLVMConstNull(Ty: &Type) -> &Value;
@@ -1155,7 +958,7 @@ extern "C" {
pub fn LLVMConstVector(ScalarConstantVals: *const &Value, Size: c_uint) -> &Value;
// Constant expressions
- pub fn LLVMRustConstInBoundsGEP2<'a>(
+ pub fn LLVMConstInBoundsGEP2<'a>(
ty: &'a Type,
ConstantVal: &'a Value,
ConstantIndices: *const &'a Value,
@@ -1868,7 +1671,10 @@ extern "C" {
pub fn LLVMRustGetLastError() -> *const c_char;
/// Print the pass timings since static dtors aren't picking them up.
- pub fn LLVMRustPrintPassTimings();
+ pub fn LLVMRustPrintPassTimings(size: *const size_t) -> *const c_char;
+
+ /// Print the statistics since static dtors aren't picking them up.
+ pub fn LLVMRustPrintStatistics(size: *const size_t) -> *const c_char;
pub fn LLVMStructCreateNamed(C: &Context, Name: *const c_char) -> &Type;
@@ -1901,6 +1707,8 @@ extern "C" {
pub fn LLVMRustCoverageWriteFilenamesSectionToBuffer(
Filenames: *const *const c_char,
FilenamesLen: size_t,
+ Lengths: *const size_t,
+ LengthsLen: size_t,
BufferOut: &RustString,
);
@@ -1908,15 +1716,18 @@ extern "C" {
pub fn LLVMRustCoverageWriteMappingToBuffer(
VirtualFileMappingIDs: *const c_uint,
NumVirtualFileMappingIDs: c_uint,
- Expressions: *const coverage_map::CounterExpression,
+ Expressions: *const crate::coverageinfo::ffi::CounterExpression,
NumExpressions: c_uint,
- MappingRegions: *const coverageinfo::CounterMappingRegion,
+ MappingRegions: *const crate::coverageinfo::ffi::CounterMappingRegion,
NumMappingRegions: c_uint,
BufferOut: &RustString,
);
- pub fn LLVMRustCoverageCreatePGOFuncNameVar(F: &Value, FuncName: *const c_char) -> &Value;
- pub fn LLVMRustCoverageHashCString(StrVal: *const c_char) -> u64;
+ pub fn LLVMRustCoverageCreatePGOFuncNameVar(
+ F: &Value,
+ FuncName: *const c_char,
+ FuncNameLen: size_t,
+ ) -> &Value;
pub fn LLVMRustCoverageHashByteArray(Bytes: *const c_char, NumBytes: size_t) -> u64;
#[allow(improper_ctypes)]
@@ -2281,7 +2092,12 @@ extern "C" {
pub fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
- pub fn LLVMRustPrintTargetCPUs(T: &TargetMachine, cpu: *const c_char);
+ pub fn LLVMRustPrintTargetCPUs(
+ T: &TargetMachine,
+ cpu: *const c_char,
+ print: unsafe extern "C" fn(out: *mut c_void, string: *const c_char, len: usize),
+ out: *mut c_void,
+ );
pub fn LLVMRustGetTargetFeaturesCount(T: &TargetMachine) -> size_t;
pub fn LLVMRustGetTargetFeature(
T: &TargetMachine,
@@ -2331,6 +2147,7 @@ extern "C" {
TM: &'a TargetMachine,
OptLevel: PassBuilderOptLevel,
OptStage: OptStage,
+ IsLinkerPluginLTO: bool,
NoPrepopulatePasses: bool,
VerifyIR: bool,
UseThinLTOBuffers: bool,
@@ -2525,6 +2342,7 @@ extern "C" {
remark_passes: *const *const c_char,
remark_passes_len: usize,
remark_file: *const c_char,
+ pgo_available: bool,
);
#[allow(improper_ctypes)]