Rollup merge of #110876 - mj10021:issue-110647-fix, r=b-naber

Added default target cpu to `--print target-cpus` output and updated docs

Added default target cpu info as requested in issue #110647 and noted the new output in the documentation
This commit is contained in:
Dylan DPC 2023-05-05 18:40:35 +05:30 committed by GitHub
commit 65702bfd6b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 24 additions and 7 deletions

View file

@ -2249,7 +2249,7 @@ extern "C" {
pub fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool; pub fn LLVMRustHasFeature(T: &TargetMachine, s: *const c_char) -> bool;
pub fn LLVMRustPrintTargetCPUs(T: &TargetMachine); pub fn LLVMRustPrintTargetCPUs(T: &TargetMachine, cpu: *const c_char);
pub fn LLVMRustGetTargetFeaturesCount(T: &TargetMachine) -> size_t; pub fn LLVMRustGetTargetFeaturesCount(T: &TargetMachine) -> size_t;
pub fn LLVMRustGetTargetFeature( pub fn LLVMRustGetTargetFeature(
T: &TargetMachine, T: &TargetMachine,

View file

@ -329,7 +329,14 @@ pub(crate) fn print(req: PrintRequest, sess: &Session) {
require_inited(); require_inited();
let tm = create_informational_target_machine(sess); let tm = create_informational_target_machine(sess);
match req { match req {
PrintRequest::TargetCPUs => unsafe { llvm::LLVMRustPrintTargetCPUs(tm) }, PrintRequest::TargetCPUs => {
// SAFETY generate a C compatible string from a byte slice to pass
// the target CPU name into LLVM, the lifetime of the reference is
// at least as long as the C function
let cpu_cstring = CString::new(handle_native(sess.target.cpu.as_ref()))
.unwrap_or_else(|e| bug!("failed to convert to cstring: {}", e));
unsafe { llvm::LLVMRustPrintTargetCPUs(tm, cpu_cstring.as_ptr()) };
}
PrintRequest::TargetFeatures => print_target_features(sess, tm), PrintRequest::TargetFeatures => print_target_features(sess, tm),
_ => bug!("rustc_codegen_llvm can't handle print request: {:?}", req), _ => bug!("rustc_codegen_llvm can't handle print request: {:?}", req),
} }

View file

@ -307,7 +307,7 @@ static size_t getLongestEntryLength(ArrayRef<KV> Table) {
return MaxLen; return MaxLen;
} }
extern "C" void LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM) { extern "C" void LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM, const char* TargetCPU) {
const TargetMachine *Target = unwrap(TM); const TargetMachine *Target = unwrap(TM);
const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo(); const MCSubtargetInfo *MCInfo = Target->getMCSubtargetInfo();
const Triple::ArchType HostArch = Triple(sys::getDefaultTargetTriple()).getArch(); const Triple::ArchType HostArch = Triple(sys::getDefaultTargetTriple()).getArch();
@ -323,10 +323,19 @@ extern "C" void LLVMRustPrintTargetCPUs(LLVMTargetMachineRef TM) {
printf(" %-*s - Select the CPU of the current host (currently %.*s).\n", printf(" %-*s - Select the CPU of the current host (currently %.*s).\n",
MaxCPULen, "native", (int)HostCPU.size(), HostCPU.data()); MaxCPULen, "native", (int)HostCPU.size(), HostCPU.data());
} }
for (auto &CPU : CPUTable) for (auto &CPU : CPUTable) {
printf(" %-*s\n", MaxCPULen, CPU.Key); // Compare cpu against current target to label the default
if (strcmp(CPU.Key, TargetCPU) == 0) {
printf(" %-*s - This is the default target CPU"
" for the current build target (currently %s).",
MaxCPULen, CPU.Key, Target->getTargetTriple().str().c_str());
}
else {
printf(" %-*s", MaxCPULen, CPU.Key);
}
printf("\n"); printf("\n");
} }
}
extern "C" size_t LLVMRustGetTargetFeaturesCount(LLVMTargetMachineRef TM) { extern "C" size_t LLVMRustGetTargetFeaturesCount(LLVMTargetMachineRef TM) {
const TargetMachine *Target = unwrap(TM); const TargetMachine *Target = unwrap(TM);

View file

@ -574,7 +574,8 @@ change in the future.
This instructs `rustc` to generate code specifically for a particular processor. This instructs `rustc` to generate code specifically for a particular processor.
You can run `rustc --print target-cpus` to see the valid options to pass You can run `rustc --print target-cpus` to see the valid options to pass
here. Each target has a default base CPU. Special values include: and the default target CPU for the current buid target.
Each target has a default base CPU. Special values include:
* `native` can be passed to use the processor of the host machine. * `native` can be passed to use the processor of the host machine.
* `generic` refers to an LLVM target with minimal features but modern tuning. * `generic` refers to an LLVM target with minimal features but modern tuning.