return Features.getFeatures();
}
+static void renderBoolStringAttr(AttrBuilder &B, StringRef Name, bool Val) {
+ B.addAttribute(Name, Val ? "true" : "false");
+}
+
+#define HANDLE_BOOL_ATTR(CL, AttrName) \
+ do { \
+ if (CL.getNumOccurrences() > 0 && !F.hasFnAttribute(AttrName)) \
+ renderBoolStringAttr(NewAttrs, AttrName, CL); \
+ } while (0)
+
+
/// Set function attributes of function \p F based on CPU, Features, and command
/// line flags.
LLVM_ATTRIBUTE_UNUSED static void
if (StackRealign)
NewAttrs.addAttribute("stackrealign");
+ HANDLE_BOOL_ATTR(EnableUnsafeFPMath, "unsafe-fp-math");
+ HANDLE_BOOL_ATTR(EnableNoInfsFPMath, "no-infs-fp-math");
+ HANDLE_BOOL_ATTR(EnableNoNaNsFPMath, "no-nans-fp-math");
+ HANDLE_BOOL_ATTR(EnableNoSignedZerosFPMath, "no-signed-zeros-fp-math");
+
if (TrapFuncName.getNumOccurrences() > 0)
for (auto &B : F)
for (auto &I : B)
}
/// Reset the target options based on the function's attributes.
+/// setFunctionAttributes should have made the raw attribute value consistent
+/// with the command line flag if used.
+//
// FIXME: This function needs to go away for a number of reasons:
// a) global state on the TargetMachine is terrible in general,
// b) these target options should be passed only on the function
// and not on the TargetMachine (via TargetOptions) at all.
void TargetMachine::resetTargetOptions(const Function &F) const {
-#define RESET_OPTION(X, Y) \
- do { \
- if (F.hasFnAttribute(Y)) \
- Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \
- else \
- Options.X = DefaultOptions.X; \
+#define RESET_OPTION(X, Y) \
+ do { \
+ Options.X = (F.getFnAttribute(Y).getValueAsString() == "true"); \
} while (0)
RESET_OPTION(UnsafeFPMath, "unsafe-fp-math");