@@ -207,7 +207,41 @@ bool HexagonLinkDriver::createInputActions(
207207
208208template <class T >
209209bool HexagonLinkDriver::processTargetOptions (llvm::opt::InputArgList &Args) {
210- return GnuLdDriver::processTargetOptions<T>(Args);
210+ bool result = GnuLdDriver::processTargetOptions<T>(Args);
211+ std::string emulation = Config.options ().getEmulation ().str ();
212+ // If a specific emulation was requested, apply it now.
213+ if (!emulation.empty ()) {
214+ llvm::Triple TheTriple = Config.targets ().triple ();
215+ std::optional<Triple> OptEmulationTriple =
216+ ParseEmulation (emulation, Config.getDiagEngine ());
217+ // Report invalid emulation error for unknown emulation.
218+ if (!OptEmulationTriple) {
219+ DiagEngine->raise (eld::Diag::err_invalid_emulation) << emulation;
220+ return false ;
221+ }
222+ Triple EmulationTriple = OptEmulationTriple.value ();
223+ if (EmulationTriple.getArch () != Triple::UnknownArch)
224+ TheTriple.setArch (EmulationTriple.getArch ());
225+ if (EmulationTriple.getOS () != Triple::OSType::UnknownOS)
226+ TheTriple.setOS (EmulationTriple.getOS ());
227+ if (EmulationTriple.getEnvironment () != Triple::UnknownEnvironment)
228+ TheTriple.setEnvironment (EmulationTriple.getEnvironment ());
229+ Config.targets ().setTriple (TheTriple);
230+ }
231+ return result;
232+ }
233+
234+ std::optional<Triple>
235+ HexagonLinkDriver::ParseEmulation (std::string pEmulation,
236+ eld::DiagnosticEngine *DiagEngine) {
237+ std::optional<Triple> result =
238+ StringSwitch<std::optional<Triple>>(pEmulation)
239+ .Case (" hexagonlinux" , Triple (" hexagon" , " " , " linux" , " gnu" ))
240+ .Cases ({" hexagonelf" , " v68" , " v69" , " v71" , " v71t" , " v73" , " v75" ,
241+ " v77" , " v79" , " v81" , " v83" , " v85" , " v87" , " v89" , " v91" },
242+ Triple (" hexagon" , " " , " " , " " ))
243+ .Default (std::nullopt );
244+ return result;
211245}
212246
213247template <class T >
@@ -217,7 +251,7 @@ bool HexagonLinkDriver::processLLVMOptions(llvm::opt::InputArgList &Args) {
217251
218252bool HexagonLinkDriver::isValidEmulation (llvm::StringRef Emulation) {
219253 return llvm::StringSwitch<bool >(Emulation)
220- .Cases ({" hexagonelf" , " v68" , " v69" , " v71" , " v71t" }, true )
254+ .Cases ({" hexagonelf" , " hexagonlinux " , " v68" , " v69" , " v71" , " v71t" }, true )
221255 .Cases ({" v73" , " v75" , " v77" , " v79" , " v81" , " v83" , " v85" , " v87" , " v89" ,
222256 " v91" },
223257 true )
0 commit comments