Skip to content

Commit

Permalink
[Driver] Warn about -mios-version-min instead of erroring out when
Browse files Browse the repository at this point in the history
targeting MachO embedded architectures

Sometimes users pass this option when targeting embedded architectures
like armv7m on non-darwin platforms.

Emit a warning instead of erroring out, which restores the behavior
prior to 34d7acd.
  • Loading branch information
ahatanaka committed Jul 13, 2023
1 parent 490e8e2 commit 509d051
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 4 deletions.
5 changes: 3 additions & 2 deletions clang/lib/Driver/Driver.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -546,14 +546,15 @@ static llvm::Triple computeTargetTriple(const Driver &D,
if (Target.isOSBinFormatMachO()) {
// If an explicit Darwin arch name is given, that trumps all.
if (!DarwinArchName.empty()) {
tools::darwin::setTripleTypeForMachOArchName(Target, DarwinArchName);
tools::darwin::setTripleTypeForMachOArchName(Target, DarwinArchName,
Args);
return Target;
}

// Handle the Darwin '-arch' flag.
if (Arg *A = Args.getLastArg(options::OPT_arch)) {
StringRef ArchName = A->getValue();
tools::darwin::setTripleTypeForMachOArchName(Target, ArchName);
tools::darwin::setTripleTypeForMachOArchName(Target, ArchName, Args);
}
}

Expand Down
8 changes: 7 additions & 1 deletion clang/lib/Driver/ToolChains/Darwin.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
.Default(llvm::Triple::UnknownArch);
}

void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str,
const ArgList &Args) {
const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
llvm::ARM::ArchKind ArchKind = llvm::ARM::parseArch(Str);
T.setArch(Arch);
Expand All @@ -84,6 +85,11 @@ void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
if (ArchKind == llvm::ARM::ArchKind::ARMV6M ||
ArchKind == llvm::ARM::ArchKind::ARMV7M ||
ArchKind == llvm::ARM::ArchKind::ARMV7EM) {
// Don't reject -mios-version-min= if we have an iOS triple.
if (T.isiOS())
if (Arg *A = Args.getLastArgNoClaim(options::OPT_mios_version_min_EQ))
A->ignoreTargetSpecific();

T.setOS(llvm::Triple::UnknownOS);
T.setObjectFormat(llvm::Triple::MachO);
}
Expand Down
3 changes: 2 additions & 1 deletion clang/lib/Driver/ToolChains/Darwin.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,8 @@ namespace tools {

namespace darwin {
llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str,
const llvm::opt::ArgList &Args);

class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
virtual void anchor();
Expand Down
3 changes: 3 additions & 0 deletions clang/test/Driver/macho-embedded.c
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
// RUN: %clang -arch armv7m -target thumbv7-apple-darwin -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-MACHO-EMBEDDED
// RUN: %clang -arch armv7em -target thumbv7-apple-darwin -### -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-MACHO-EMBEDDED

// RUN: %clang -arch armv7m --target=thumbv7-apple-ios -mios-version-min=5 -fdriver-only -c %s 2>&1 | FileCheck %s --check-prefix=CHECK-MACHO-EMBEDDED-DIAG

// CHECK-IOS: "-triple" "thumbv7" "thumbv7-apple-ios

// CHECK-AAPCS: "-target-abi" "aapcs"
// CHECK-APCS: "-target-abi" "apcs-gnu"

// CHECK-MACHO-EMBEDDED-DIAG: warning: argument unused during compilation: '-mios-version-min=5'
// CHECK-MACHO-EMBEDDED: "-triple" "{{thumbv[67]e?m}}-apple-unknown-macho"
// CHECK-MACHO-EMBEDDED: "-mrelocation-model" "pic"

0 comments on commit 509d051

Please sign in to comment.