1515#include " llvm/Support/Process.h"
1616#include " llvm/Support/Signals.h"
1717#include " llvm/Support/raw_ostream.h"
18+ #include < optional>
1819
1920using namespace llvm ;
2021using namespace llvm ::opt;
@@ -40,21 +41,21 @@ static constexpr llvm::opt::OptTable::Info infoTable[] = {
4041#undef OPTION
4142};
4243
43- static Triple ParseEmulation (std::string pEmulation, Triple &triple,
44- DiagnosticEngine *DiagEngine) {
44+ std::optional<Triple>
45+ ARMLinkDriver::ParseEmulation (std::string pEmulation,
46+ DiagnosticEngine *DiagEngine) {
4547 // armelf_linux_androideabi -- used for android emulation.
46- Triple result =
47- StringSwitch<Triple>(pEmulation)
48+ std::optional< Triple> result =
49+ StringSwitch<std::optional< Triple> >(pEmulation)
4850 .Case (" aarch64linux" , Triple (" aarch64" , " " , " linux" , " gnu" ))
4951 .Case (" aarch64linux_androideabi" ,
5052 Triple (" aarch64" , " " , " linux" , " androideabi" ))
5153 .Case (" armelf_linux_eabi" , Triple (" arm" , " " , " linux" , " gnueabi" ))
5254 .Case (" armelf_linux_androideabi" ,
5355 Triple (" arm" , " " , " linux" , " androideabi" ))
54- .Default (Triple (" unknown" , " " , " " , " " ));
55- // Report invalid emulation error for unknown emulation.
56- if (result.getArchName () == " unknown" )
57- DiagEngine->raise (Diag::err_invalid_emulation) << pEmulation << " \n " ;
56+ .Case (" armelf" , Triple (" arm" , " " , " " , " " ))
57+ .Case (" aarch64elf" , Triple (" aarch64" , " " , " " , " " ))
58+ .Default (std::nullopt );
5859 return result;
5960}
6061
@@ -244,11 +245,18 @@ bool ARMLinkDriver::processTargetOptions(llvm::opt::InputArgList &Args) {
244245 // If a specific emulation was requested, apply it now.
245246 if (!emulation.empty ()) {
246247 llvm::Triple TheTriple = Config.targets ().triple ();
247- Triple EmulationTriple =
248- ParseEmulation (emulation, TheTriple, Config.getDiagEngine ());
248+ std::optional<Triple> OptEmulationTriple =
249+ ParseEmulation (emulation, Config.getDiagEngine ());
250+ // Report invalid emulation error for unknown emulation.
251+ if (!OptEmulationTriple) {
252+ DiagEngine->raise (Diag::err_invalid_emulation) << emulation << " \n " ;
253+ return false ;
254+ }
255+ Triple EmulationTriple = OptEmulationTriple.value ();
249256 if (EmulationTriple.getArch () != Triple::UnknownArch)
250257 TheTriple.setArch (EmulationTriple.getArch ());
251- TheTriple.setOS (EmulationTriple.getOS ());
258+ if (EmulationTriple.getOS () != Triple::OSType::UnknownOS)
259+ TheTriple.setOS (EmulationTriple.getOS ());
252260 if (EmulationTriple.getEnvironment () != Triple::UnknownEnvironment)
253261 TheTriple.setEnvironment (EmulationTriple.getEnvironment ());
254262 Config.targets ().setTriple (TheTriple);
0 commit comments