@@ -146,26 +146,49 @@ void x86::getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
146
146
// flags). This is a bit hacky but keeps existing usages working. We should
147
147
// consider deprecating this and instead warn if the user requests external
148
148
// retpoline thunks and *doesn't* request some form of retpolines.
149
+ auto SpectreOpt = clang::driver::options::ID::OPT_INVALID;
149
150
if (Args.hasArgNoClaim (options::OPT_mretpoline, options::OPT_mno_retpoline,
150
151
options::OPT_mspeculative_load_hardening,
151
152
options::OPT_mno_speculative_load_hardening)) {
152
153
if (Args.hasFlag (options::OPT_mretpoline, options::OPT_mno_retpoline,
153
154
false )) {
154
155
Features.push_back (" +retpoline-indirect-calls" );
155
156
Features.push_back (" +retpoline-indirect-branches" );
157
+ SpectreOpt = options::OPT_mretpoline;
156
158
} else if (Args.hasFlag (options::OPT_mspeculative_load_hardening,
157
159
options::OPT_mno_speculative_load_hardening,
158
160
false )) {
159
161
// On x86, speculative load hardening relies on at least using retpolines
160
162
// for indirect calls.
161
163
Features.push_back (" +retpoline-indirect-calls" );
164
+ SpectreOpt = options::OPT_mspeculative_load_hardening;
162
165
}
163
166
} else if (Args.hasFlag (options::OPT_mretpoline_external_thunk,
164
167
options::OPT_mno_retpoline_external_thunk, false )) {
165
168
// FIXME: Add a warning about failing to specify `-mretpoline` and
166
169
// eventually switch to an error here.
167
170
Features.push_back (" +retpoline-indirect-calls" );
168
171
Features.push_back (" +retpoline-indirect-branches" );
172
+ SpectreOpt = options::OPT_mretpoline_external_thunk;
173
+ }
174
+
175
+ auto LVIOpt = clang::driver::options::ID::OPT_INVALID;
176
+ if (Args.hasFlag (options::OPT_mlvi_hardening, options::OPT_mno_lvi_hardening,
177
+ false )) {
178
+ Features.push_back (" +lvi-load-hardening" );
179
+ Features.push_back (" +lvi-cfi" ); // load hardening implies CFI protection
180
+ LVIOpt = options::OPT_mlvi_hardening;
181
+ } else if (Args.hasFlag (options::OPT_mlvi_cfi, options::OPT_mno_lvi_cfi,
182
+ false )) {
183
+ Features.push_back (" +lvi-cfi" );
184
+ LVIOpt = options::OPT_mlvi_cfi;
185
+ }
186
+
187
+ if (SpectreOpt != clang::driver::options::ID::OPT_INVALID &&
188
+ LVIOpt != clang::driver::options::ID::OPT_INVALID) {
189
+ D.Diag (diag::err_drv_argument_not_allowed_with)
190
+ << D.getOpts ().getOptionName (SpectreOpt)
191
+ << D.getOpts ().getOptionName (LVIOpt);
169
192
}
170
193
171
194
// Now add any that the user explicitly requested on the command line,
0 commit comments