Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
93c8b74
document that t-lang does not need involvement for unobservable intri…
RalfJung Aug 24, 2026
1b08f98
Slightly extend `tests/run-make/target-specs/rmake.rs`
nnethercote Aug 27, 2026
39ca15c
Adjust when "This is the default target CPU..." message is printed
nnethercote Aug 27, 2026
ac05dbe
Explicitly set the `cpu` field for `avr-none`
nnethercote Aug 27, 2026
0911b0a
Simplify `OwnedTargetMachine`
nnethercote Aug 31, 2026
7f0581d
Fix initialization cycle in `target_config`
nnethercote Aug 26, 2026
768091d
fix: don't panic on doc comments attached to literal expressions
Aditya-PS-05 Sep 4, 2026
f8326c9
ide: fix doc comment offset calculation
dimxy Sep 6, 2026
af3f278
internal: Add regression test for 'failed to unify type errors' panic
Wilfred Sep 7, 2026
fcdf7f6
Merge pull request #23309 from Wilfred/fix/term-search-unify-regressi…
ChayimFriedman2 Sep 7, 2026
071f269
fix: restore the `#[deprecated]` attr
ada4a Sep 3, 2026
ccfeaac
remove `allow`s that are no longer necessary
ada4a Aug 11, 2026
1aa9a9e
Fix `hir::Type` owner mismatches between anon consts
ChayimFriedman2 Sep 8, 2026
0de0415
Remove some unused code
ChayimFriedman2 Sep 8, 2026
2cd39c2
Merge pull request #23316 from ChayimFriedman2/remove-unused
ChayimFriedman2 Sep 8, 2026
a57cd31
Do not fill the body for `Drop::drop()` and `#[rustc_must_implement_o…
ChayimFriedman2 Sep 8, 2026
9fdf3cd
Do not run the "Generate lints and feature flags" CI workflow on forks
ChayimFriedman2 Sep 8, 2026
f625440
Merge pull request #23321 from ChayimFriedman2/no-lints-workflow-fork
ChayimFriedman2 Sep 8, 2026
45dda07
Merge pull request #23300 from dimxy/fix-doc-comment-nav-panic
ChayimFriedman2 Sep 8, 2026
1793d1e
Stop at eager macro recursion overflow
ChayimFriedman2 Sep 8, 2026
77db98f
use `expect` for lints we actually expect
ada4a Aug 11, 2026
3bae6b7
follow the suggestions of the lints
ada4a Aug 11, 2026
27e05d3
triage `clippy::disallowed_types`
ada4a Sep 7, 2026
93bf99f
underscore-prefix the field storing `EnteredSpan`
ada4a Sep 9, 2026
e6c7cf4
a few more misc clean-ups
ada4a Aug 11, 2026
065aa82
fix: Don't support const blocks in patterns
Wilfred Sep 7, 2026
c596c7d
fix: do not panic on json with invalid field name
A4-Tacks Sep 9, 2026
f82e963
fix: correct incorrect_case suggestion for raw identifiers
edragain2nd Sep 9, 2026
178a4df
Merge pull request #23311 from ada4a/push-lwkopltlwnlt
ChayimFriedman2 Sep 9, 2026
d22bc72
Merge pull request #23307 from Wilfred/fix/const-block-double-infer
ChayimFriedman2 Sep 9, 2026
3cdd184
Merge pull request #23330 from A4-Tacks/json-invalid-field-name
ChayimFriedman2 Sep 9, 2026
e3fefe4
Merge pull request #23333 from edragain2nd/fix/incorrect_upper_camel_…
ChayimFriedman2 Sep 9, 2026
a538446
Merge pull request #23295 from Aditya-PS-05/fix-doc-comment-literal-p…
ChayimFriedman2 Sep 9, 2026
ff71565
fix: correct incorrect_case suggestion for enum variants with raw key…
edragain2nd Sep 10, 2026
cea6437
Merge pull request #23340 from edragain2nd/fix/incorrect_upper_camel_…
A4-Tacks Sep 10, 2026
8ff7045
Merge pull request #23315 from ChayimFriedman2/anon-const-owner
Veykril Sep 11, 2026
fc45e8c
Merge pull request #23317 from ChayimFriedman2/force-empty-body
Veykril Sep 11, 2026
60aff9f
Merge pull request #23323 from ChayimFriedman2/eager-recursion-limit
Veykril Sep 11, 2026
f28bf11
Add regression test for previous overflow evaluating the requirement
lsunsi Sep 11, 2026
20ceed7
regression test for valtree leaf const
malezjaa Sep 13, 2026
df4f90d
panic when we call impls_trait for types associated with builtin deri…
anatawa12 Sep 13, 2026
1be3e33
Add regression test for unexpected type for constructor
lsunsi Sep 13, 2026
b14856a
Merge pull request #23352 from anatawa12/fix-panic-with-is-impl-with-…
ChayimFriedman2 Sep 13, 2026
9282e0a
Remove the interner/db argument from `empty()` and `default_types()`
ChayimFriedman2 Sep 9, 2026
05c806d
Do not fill unstable methods in "Implement default members"
ChayimFriedman2 Sep 8, 2026
e9e9680
Merge pull request #23325 from ChayimFriedman2/no-interner-interneds
ChayimFriedman2 Sep 13, 2026
62bfc83
Merge pull request #23318 from ChayimFriedman2/add-impl-members-unstable
ChayimFriedman2 Sep 13, 2026
f0eb4b5
Remove pointless A: Allocator bounds in boxed.rs
maxdexh Sep 13, 2026
c3cecf5
Rollup merge of #162752 - lnicola:sync-from-ra, r=lnicola
Zalathar Sep 14, 2026
092bf77
Rollup merge of #161903 - nnethercote:fix-target_config-cycle, r=nikic
Zalathar Sep 14, 2026
ac73b1b
Rollup merge of #161675 - RalfJung:intrinsic-approval, r=traviscross,…
Zalathar Sep 14, 2026
8592634
Rollup merge of #162647 - lsunsi:issue219, r=mu001999
Zalathar Sep 14, 2026
840de36
Rollup merge of #162703 - malezjaa:regression-test-valtree-leaf-const…
Zalathar Sep 14, 2026
360ab3e
Rollup merge of #162723 - lsunsi:issue162393, r=chenyukang
Zalathar Sep 14, 2026
5c48da2
Rollup merge of #162735 - maxdexh:boundless-fun, r=jhpratt
Zalathar Sep 14, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler/rustc_codegen_llvm/src/back/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
pub(crate) mod archive;
pub(crate) mod lto;
pub(crate) mod owned_mc_subtarget_info;
pub(crate) mod owned_target_machine;
mod profiling;
pub(crate) mod write;
49 changes: 49 additions & 0 deletions compiler/rustc_codegen_llvm/src/back/owned_mc_subtarget_info.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
use std::ffi::CStr;
use std::ptr::NonNull;

use rustc_data_structures::small_c_str::SmallCStr;

use crate::diagnostics::LlvmError;
use crate::llvm;

/// Responsible for safely creating and disposing llvm::MCSubtargetInfo via ffi functions.
/// Not cloneable as there is no clone function for llvm::MCSubtargetInfo.
pub(crate) struct OwnedMCSubtargetInfo {
info_unique: NonNull<llvm::MCSubtargetInfo>,
}

impl OwnedMCSubtargetInfo {
pub(crate) fn new(
triple: &CStr,
cpu: &CStr,
features: &CStr,
) -> Result<Self, LlvmError<'static>> {
// SAFETY: llvm::LLVMRustCreateMCSubtargetInfo copies pointed-to data.
let info_ptr = unsafe {
llvm::LLVMRustCreateMCSubtargetInfo(triple.as_ptr(), cpu.as_ptr(), features.as_ptr())
};

NonNull::new(info_ptr)
.map(|info_unique| Self { info_unique })
.ok_or_else(|| LlvmError::CreateMCSubtargetInfo { triple: SmallCStr::from(triple) })
}

pub(crate) fn has_feature(&self, feature: &CStr) -> bool {
// SAFETY: `new` ensures we have a valid pointer created by
// `llvm::LLVMRustCreateMCSubtargetInfo`.
unsafe {
llvm::LLVMRustMCSubtargetInfoHasFeature(self.info_unique.as_ref(), feature.as_ptr())
}
}
}

impl Drop for OwnedMCSubtargetInfo {
fn drop(&mut self) {
// SAFETY: `new` ensures we have a valid pointer created by
// `llvm::LLVMRustCreateMCSubtargetInfo` and `OwnedMCSubtargetInfo` is not copyable so
// there is no double free or use after free.
unsafe {
llvm::LLVMRustDisposeMCSubtargetInfo(self.info_unique);
}
}
}
7 changes: 2 additions & 5 deletions compiler/rustc_codegen_llvm/src/back/owned_target_machine.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
use std::ffi::CStr;
use std::marker::PhantomData;
use std::ptr::NonNull;

use rustc_data_structures::small_c_str::SmallCStr;
Expand All @@ -9,10 +8,8 @@ use crate::llvm;

/// Responsible for safely creating and disposing llvm::TargetMachine via ffi functions.
/// Not cloneable as there is no clone function for llvm::TargetMachine.
#[repr(transparent)]
pub struct OwnedTargetMachine {
tm_unique: NonNull<llvm::TargetMachine>,
phantom: PhantomData<llvm::TargetMachine>,
}

impl OwnedTargetMachine {
Expand Down Expand Up @@ -41,7 +38,7 @@ impl OwnedTargetMachine {
use_wasm_eh: bool,
large_data_threshold: u64,
) -> Result<Self, LlvmError<'static>> {
// SAFETY: llvm::LLVMRustCreateTargetMachine copies pointed to data
// SAFETY: llvm::LLVMRustCreateTargetMachine copies pointed-to data.
let tm_ptr = unsafe {
llvm::LLVMRustCreateTargetMachine(
triple.as_ptr(),
Expand Down Expand Up @@ -71,7 +68,7 @@ impl OwnedTargetMachine {
};

NonNull::new(tm_ptr)
.map(|tm_unique| Self { tm_unique, phantom: PhantomData })
.map(|tm_unique| Self { tm_unique })
.ok_or_else(|| LlvmError::CreateTargetMachine { triple: SmallCStr::from(triple) })
}

Expand Down
12 changes: 3 additions & 9 deletions compiler/rustc_codegen_llvm/src/back/write.rs
Original file line number Diff line number Diff line change
Expand Up @@ -100,17 +100,12 @@ fn write_output_file<'ll>(
result.into_result().unwrap_or_else(|()| llvm_err(dcx, LlvmError::WriteOutput { path: output }))
}

/// If `for_cfg` is `true` then we are creating this machine for the purpose of populating
/// [`rustc_codegen_ssa::TargetConfig`] based on what LLVM actually enables in this configuration.
/// `-Ctarget-feature` should be ignored in that case since it is already processed separately.
pub(crate) fn create_informational_target_machine(
sess: &Session,
for_cfg: bool,
) -> OwnedTargetMachine {
pub(crate) fn create_informational_target_machine(sess: &Session) -> OwnedTargetMachine {
let config = TargetMachineFactoryConfig { split_dwarf_file: None, output_obj_file: None };
// Can't use query system here quite yet because this function is invoked before the query
// system/tcx is set up.
let features = llvm_util::global_llvm_features(sess, for_cfg);
let features = llvm_util::global_llvm_features(sess, /* for_cfg */ false);

target_machine_factory(sess, config::OptLevel::No, &features)(sess.dcx(), config)
}

Expand Down Expand Up @@ -212,7 +207,6 @@ pub(crate) fn target_machine_factory(

let code_model = to_llvm_code_model(sess.code_model());

// This is used to set cfg_has_threads, so all logic must be in this method.
let singlethread = sess.target.singlethread(&sess.internal_target_features);

let triple = SmallCStr::new(&versioned_llvm_target(sess));
Expand Down
2 changes: 1 addition & 1 deletion compiler/rustc_codegen_llvm/src/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ pub(crate) unsafe fn create_module<'ll>(

// Ensure the data-layout values hardcoded remain the defaults.
{
let tm = crate::back::write::create_informational_target_machine(sess, false);
let tm = crate::back::write::create_informational_target_machine(sess);
unsafe {
llvm::LLVMRustSetDataLayoutFromTargetMachine(llmod, tm.raw());
}
Expand Down
5 changes: 5 additions & 0 deletions compiler/rustc_codegen_llvm/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,8 @@ pub(crate) enum LlvmError<'a> {
WriteOutput { path: &'a Path },
#[diag("could not create LLVM TargetMachine for triple: {$triple}")]
CreateTargetMachine { triple: SmallCStr },
#[diag("could not create LLVM MCSubtargetInfo for triple: {$triple}")]
CreateMCSubtargetInfo { triple: SmallCStr },
#[diag("failed to run LLVM passes")]
RunLlvmPasses,
#[diag("failed to write LLVM IR to {$path}")]
Expand All @@ -149,6 +151,9 @@ impl<G: EmissionGuarantee> Diagnostic<'_, G> for WithLlvmError<'_> {
CreateTargetMachine { .. } => {
msg!("could not create LLVM TargetMachine for triple: {$triple}: {$llvm_err}")
}
CreateMCSubtargetInfo { .. } => {
msg!("could not create LLVM MCSubtargetInfo for triple: {$triple}: {$llvm_err}")
}
RunLlvmPasses => msg!("failed to run LLVM passes: {$llvm_err}"),
WriteIr { .. } => msg!("failed to write LLVM IR to {$path}: {$llvm_err}"),
PrepareThinLtoContext => {
Expand Down
4 changes: 2 additions & 2 deletions compiler/rustc_codegen_llvm/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -248,7 +248,7 @@ impl CodegenBackend for LlvmCodegenBackend {

fn provide(&self, providers: &mut Providers) {
providers.queries.global_backend_features =
|tcx, ()| llvm_util::global_llvm_features(tcx.sess, false)
|tcx, ()| llvm_util::global_llvm_features(tcx.sess, /* for_cfg */ false)
}

fn print(&self, req: &PrintRequest, out: &mut String, sess: &Session) {
Expand Down Expand Up @@ -496,7 +496,7 @@ impl ModuleLlvm {
ModuleLlvm {
llmod_raw,
llcx,
tm: ManuallyDrop::new(create_informational_target_machine(tcx.sess, false)),
tm: ManuallyDrop::new(create_informational_target_machine(tcx.sess)),
}
}
}
Expand Down
15 changes: 14 additions & 1 deletion compiler/rustc_codegen_llvm/src/llvm/ffi.rs
Original file line number Diff line number Diff line change
Expand Up @@ -720,6 +720,7 @@ unsafe extern "C" {
pub type TargetMachine;
}
unsafe extern "C" {
pub(crate) type MCSubtargetInfo;
pub(crate) type Twine;
pub(crate) type DiagnosticInfo;
pub(crate) type SMDiagnostic;
Expand Down Expand Up @@ -2372,7 +2373,6 @@ unsafe extern "C" {
pub(crate) fn LLVMRustWriteTypeToString(Type: &Type, s: &RustString);
pub(crate) fn LLVMRustWriteValueToString(value_ref: &Value, s: &RustString);

pub(crate) fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
pub(crate) fn LLVMRustTargetHasMnemonic(T: &TargetMachine, s: *const c_char) -> bool;

pub(crate) fn LLVMRustPrintTargetCPUs(TM: &TargetMachine, OutStr: &RustString);
Expand Down Expand Up @@ -2414,6 +2414,19 @@ unsafe extern "C" {
LargeDataThreshold: u64,
) -> *mut TargetMachine;

pub(crate) fn LLVMRustCreateMCSubtargetInfo(
TripleStr: *const c_char,
CPU: *const c_char,
Features: *const c_char,
) -> *mut MCSubtargetInfo;

pub(crate) fn LLVMRustMCSubtargetInfoHasFeature(
MCInfo: &MCSubtargetInfo,
Feature: *const c_char,
) -> bool;

pub(crate) fn LLVMRustDisposeMCSubtargetInfo(MCInfo: ptr::NonNull<MCSubtargetInfo>);

pub(crate) fn LLVMRustAddLibraryInfo<'a>(
T: &TargetMachine,
PM: &PassManager<'a>,
Expand Down
29 changes: 20 additions & 9 deletions compiler/rustc_codegen_llvm/src/llvm_util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ use std::sync::Once;
use std::{ptr, slice, str};

use libc::c_int;
use rustc_codegen_ssa::back::versioned_llvm_target;
use rustc_codegen_ssa::base::wants_wasm_eh;
use rustc_codegen_ssa::target_features::internal_target_features;
use rustc_codegen_ssa::{TargetConfig, target_features};
Expand All @@ -20,7 +21,8 @@ use rustc_target::spec::{
};
use smallvec::{SmallVec, smallvec};

use crate::back::write::create_informational_target_machine;
use crate::back::owned_mc_subtarget_info::OwnedMCSubtargetInfo;
use crate::back::write::{create_informational_target_machine, llvm_err};
use crate::{diagnostics, llvm};

static INIT: Once = Once::new();
Expand Down Expand Up @@ -337,7 +339,14 @@ pub(crate) fn to_llvm_features<'a>(sess: &Session, s: &'a str) -> Option<LLVMFea
///
/// We do not have to worry about RUSTC_SPECIFIC_FEATURES here, those are handled outside codegen.
pub(crate) fn target_config(sess: &Session) -> TargetConfig {
let target_machine = create_informational_target_machine(sess, true);
require_inited();
let target_features = global_llvm_features(sess, /* for_cfg */ true);

let triple = SmallCStr::new(&versioned_llvm_target(sess));
let cpu = SmallCStr::new(target_cpu(sess));
let features = CString::new(target_features.join(",")).unwrap();
let mc_subtarget_info = OwnedMCSubtargetInfo::new(&triple, &cpu, &features)
.unwrap_or_else(|err| llvm_err(sess.dcx(), err));

let internal_target_features = internal_target_features(
sess,
Expand All @@ -348,16 +357,17 @@ pub(crate) fn target_config(sess: &Session) -> TargetConfig {
},
|feature| {
// This closure determines whether the target CPU has the feature according to LLVM. We
// do *not* consider the `-Ctarget-feature`s here, as that will be handled later in
// do *not* consider the `-Ctarget-feature`s here (that's why we passed `for_cfg: true`
// to `global_llvm_features` above) because that will be handled later in
// `internal_target_features`.
if let Some(feat) = to_llvm_features(sess, feature) {
// All the LLVM features this expands to must be enabled.
for llvm_feature in feat {
let cstr = SmallCStr::new(llvm_feature);
// `LLVMRustHasFeature` is moderately expensive. On targets with many
// `has_feature` is moderately expensive. On targets with many
// features (e.g. x86) these calls take a non-trivial fraction of runtime
// when compiling very small programs.
if !unsafe { llvm::LLVMRustHasFeature(target_machine.raw(), cstr.as_ptr()) } {
if !mc_subtarget_info.has_feature(&cstr) {
return false;
}
}
Expand Down Expand Up @@ -500,7 +510,7 @@ fn llvm_target_features(tm: &llvm::TargetMachine) -> Vec<(&str, &str)> {

pub(crate) fn print(req: &PrintRequest, out: &mut String, sess: &Session) {
require_inited();
let tm = create_informational_target_machine(sess, false);
let tm = create_informational_target_machine(sess);
match req.kind {
PrintKind::TargetCPUs => print_target_cpus(sess, tm.raw(), out),
PrintKind::TargetFeatures => print_target_features(sess, tm.raw(), out),
Expand All @@ -518,10 +528,11 @@ fn print_target_cpus(sess: &Session, tm: &llvm::TargetMachine, out: &mut String)
cpu_name: &'a str,
remark: String,
}
// Compare CPU against current target to label the default.
// Compare CPU against current target to label the default. Do not print it if
// `need_explicit_cpu` is set, because in that case the concept of default makes less sense.
let target_cpu = handle_native(&sess.target.cpu);
let make_remark = |cpu_name| {
if cpu_name == target_cpu {
if cpu_name == target_cpu && !sess.target.need_explicit_cpu {
// FIXME(#132514): This prints the LLVM target string, which can be
// different from the Rust target string. Is that intended?
let target = &sess.target.llvm_target;
Expand Down Expand Up @@ -797,7 +808,7 @@ pub(crate) fn tune_cpu(sess: &Session) -> Option<&str> {

pub(crate) fn target_has_mnemonic(sess: &Session, mnemonic: &str) -> bool {
require_inited();
let tm = create_informational_target_machine(sess, false);
let tm = create_informational_target_machine(sess);
let cstr = SmallCStr::new(mnemonic);
unsafe { llvm::LLVMRustTargetHasMnemonic(tm.raw(), cstr.as_ptr()) }
}
30 changes: 23 additions & 7 deletions compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,15 +89,31 @@ extern "C" void LLVMRustTimeTraceProfilerFinish(const char *FileName) {
timeTraceProfilerCleanup();
}

extern "C" bool LLVMRustHasFeature(LLVMTargetMachineRef TM,
const char *Feature) {
TargetMachine *Target = unwrap(TM);
#if LLVM_VERSION_GE(23, 0)
const MCSubtargetInfo &MCInfo = Target->getMCSubtargetInfo();
extern "C" MCSubtargetInfo *
LLVMRustCreateMCSubtargetInfo(const char *TripleStr, const char *CPU,
const char *Features) {
std::string Error;
auto Trip = Triple(Triple::normalize(TripleStr));
const llvm::Target *TheTarget = TargetRegistry::lookupTarget(Trip, Error);
if (TheTarget == nullptr) {
LLVMRustSetLastError(Error.c_str());
return nullptr;
}

#if LLVM_VERSION_GE(22, 0)
return TheTarget->createMCSubtargetInfo(Trip, CPU, Features);
#else
const MCSubtargetInfo &MCInfo = *Target->getMCSubtargetInfo();
return TheTarget->createMCSubtargetInfo(Trip.str(), CPU, Features);
#endif
return MCInfo.checkFeatures(std::string("+") + Feature);
}

extern "C" bool LLVMRustMCSubtargetInfoHasFeature(MCSubtargetInfo *MCInfo,
const char *Feature) {
return MCInfo->checkFeatures(std::string("+") + Feature);
}

extern "C" void LLVMRustDisposeMCSubtargetInfo(MCSubtargetInfo *MCInfo) {
delete MCInfo;
}

/// Check whether the target has a specific assembly mnemonic like `ret` or
Expand Down
9 changes: 5 additions & 4 deletions compiler/rustc_target/src/spec/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2262,11 +2262,12 @@ pub struct TargetOptions {
/// Extra arguments to pass to the external assembler (when used)
pub asm_args: StaticCow<[StaticCow<str>]>,

/// Default CPU to pass to LLVM. Corresponds to `llc -mcpu=$cpu`. Defaults
/// to "generic".
/// Default CPU to pass to LLVM. Corresponds to `llc -mcpu=$cpu`. Must be a name the backend
/// accepts. Defaults to "generic" (which some backends won't accept).
pub cpu: StaticCow<str>,
/// Whether a cpu needs to be explicitly set.
/// Set to true if there is no default cpu. Defaults to false.
/// Whether a cpu needs to be explicitly set via `-Ctarget-cpu` for codegen to run. (Even if
/// true, `cpu` is still consulted on non-codegen paths such as cfg/feature computation.)
/// Defaults to false.
pub need_explicit_cpu: bool,
/// Whether `-Ctarget-cpu` is treated as a target modifier. If this is set
/// all crates that are linked together must have been compiled with the
Expand Down
1 change: 1 addition & 0 deletions compiler/rustc_target/src/spec/targets/avr_none.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ pub(crate) fn target() -> Target {
pointer_width: 16,
options: TargetOptions {
c_int_width: 16,
cpu: "avr2".into(),
exe_suffix: ".elf".into(),
linker: Some("avr-gcc".into()),
eh_frame_header: false,
Expand Down
Loading
Loading