mirror of
https://github.com/intel/llvm.git
synced 2026-02-08 00:50:03 +08:00
Move support for "#pragma STDC FP_CONTRACT" to Parser; add Sema actions
llvm-svn: 125474
This commit is contained in:
@@ -118,6 +118,7 @@ public:
|
||||
// single precision constants.
|
||||
unsigned FastRelaxedMath : 1; // OpenCL fast relaxed math (on its own,
|
||||
// defines __FAST_RELAXED_MATH__).
|
||||
unsigned DefaultFPContract : 1; // Default setting for FP_CONTRACT
|
||||
// FIXME: This is just a temporary option, for testing purposes.
|
||||
unsigned NoBitFieldTypeAlign : 1;
|
||||
|
||||
@@ -210,6 +211,7 @@ public:
|
||||
SpellChecking = 1;
|
||||
SinglePrecisionConstants = 0;
|
||||
FastRelaxedMath = 0;
|
||||
DefaultFPContract = 0;
|
||||
NoBitFieldTypeAlign = 0;
|
||||
}
|
||||
|
||||
@@ -236,6 +238,17 @@ public:
|
||||
}
|
||||
};
|
||||
|
||||
/// Floating point control options
|
||||
class FPOptions {
|
||||
public:
|
||||
unsigned fp_contract : 1;
|
||||
|
||||
FPOptions() : fp_contract(0) {}
|
||||
|
||||
FPOptions(const LangOptions &LangOpts) :
|
||||
fp_contract(LangOpts.DefaultFPContract) {}
|
||||
};
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -122,6 +122,7 @@ class Parser : public CodeCompletionHandler {
|
||||
llvm::OwningPtr<PragmaHandler> PackHandler;
|
||||
llvm::OwningPtr<PragmaHandler> UnusedHandler;
|
||||
llvm::OwningPtr<PragmaHandler> WeakHandler;
|
||||
llvm::OwningPtr<PragmaHandler> FPContractHandler;
|
||||
|
||||
/// Whether the '>' token acts as an operator or not. This will be
|
||||
/// true except when we are parsing an expression within a C++
|
||||
|
||||
@@ -210,6 +210,8 @@ public:
|
||||
typedef TemplateParameterList TemplateParamsTy;
|
||||
typedef NestedNameSpecifier CXXScopeTy;
|
||||
|
||||
FPOptions FPFeatures;
|
||||
|
||||
const LangOptions &LangOpts;
|
||||
Preprocessor &PP;
|
||||
ASTContext &Context;
|
||||
@@ -544,6 +546,8 @@ public:
|
||||
void Initialize();
|
||||
|
||||
const LangOptions &getLangOptions() const { return LangOpts; }
|
||||
FPOptions &getFPOptions() { return FPFeatures; }
|
||||
|
||||
Diagnostic &getDiagnostics() const { return Diags; }
|
||||
SourceManager &getSourceManager() const { return SourceMgr; }
|
||||
const TargetAttributesSema &getTargetAttributesSema() const;
|
||||
@@ -4407,6 +4411,10 @@ public:
|
||||
SourceLocation WeakNameLoc,
|
||||
SourceLocation AliasNameLoc);
|
||||
|
||||
/// ActOnPragmaFPContract - Called on well formed
|
||||
/// #pragma STDC FP_CONTRACT
|
||||
void ActOnPragmaFPContract(tok::OnOffSwitch OOS);
|
||||
|
||||
/// AddAlignmentAttributesForRecord - Adds any needed alignment attributes to
|
||||
/// a the record decl, to handle '#pragma pack' and '#pragma options align'.
|
||||
void AddAlignmentAttributesForRecord(RecordDecl *RD);
|
||||
|
||||
@@ -962,20 +962,6 @@ struct PragmaPopMacroHandler : public PragmaHandler {
|
||||
|
||||
// Pragma STDC implementations.
|
||||
|
||||
/// PragmaSTDC_FP_CONTRACTHandler - "#pragma STDC FP_CONTRACT ...".
|
||||
struct PragmaSTDC_FP_CONTRACTHandler : public PragmaHandler {
|
||||
PragmaSTDC_FP_CONTRACTHandler() : PragmaHandler("FP_CONTRACT") {}
|
||||
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
|
||||
Token &Tok) {
|
||||
// We just ignore the setting of FP_CONTRACT. Since we don't do contractions
|
||||
// at all, our default is OFF and setting it to ON is an optimization hint
|
||||
// we can safely ignore. When we support -ffma or something, we would need
|
||||
// to diagnose that we are ignoring FMA.
|
||||
tok::OnOffSwitch OOS;
|
||||
PP.LexOnOffSwitch(OOS);
|
||||
}
|
||||
};
|
||||
|
||||
/// PragmaSTDC_FENV_ACCESSHandler - "#pragma STDC FENV_ACCESS ...".
|
||||
struct PragmaSTDC_FENV_ACCESSHandler : public PragmaHandler {
|
||||
PragmaSTDC_FENV_ACCESSHandler() : PragmaHandler("FENV_ACCESS") {}
|
||||
@@ -1034,7 +1020,6 @@ void Preprocessor::RegisterBuiltinPragmas() {
|
||||
AddPragmaHandler("clang", new PragmaDependencyHandler());
|
||||
AddPragmaHandler("clang", new PragmaDiagnosticHandler());
|
||||
|
||||
AddPragmaHandler("STDC", new PragmaSTDC_FP_CONTRACTHandler());
|
||||
AddPragmaHandler("STDC", new PragmaSTDC_FENV_ACCESSHandler());
|
||||
AddPragmaHandler("STDC", new PragmaSTDC_CX_LIMITED_RANGEHandler());
|
||||
AddPragmaHandler("STDC", new PragmaSTDC_UnknownHandler());
|
||||
|
||||
@@ -371,3 +371,14 @@ void PragmaWeakHandler::HandlePragma(Preprocessor &PP,
|
||||
Actions.ActOnPragmaWeakID(WeakName, WeakLoc, WeakNameLoc);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
PragmaFPContractHandler::HandlePragma(Preprocessor &PP,
|
||||
PragmaIntroducerKind Introducer,
|
||||
Token &Tok) {
|
||||
tok::OnOffSwitch OOS;
|
||||
if (PP.LexOnOffSwitch(OOS))
|
||||
return;
|
||||
|
||||
Actions.ActOnPragmaFPContract(OOS);
|
||||
}
|
||||
|
||||
@@ -80,6 +80,17 @@ public:
|
||||
Token &FirstToken);
|
||||
};
|
||||
|
||||
class PragmaFPContractHandler : public PragmaHandler {
|
||||
Sema &Actions;
|
||||
Parser &parser;
|
||||
public:
|
||||
PragmaFPContractHandler(Sema &S, Parser& p) :
|
||||
PragmaHandler("FP_CONTRACT"), Actions(S), parser(p) {}
|
||||
virtual void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
|
||||
Token &FirstToken);
|
||||
};
|
||||
|
||||
|
||||
} // end namespace clang
|
||||
|
||||
#endif
|
||||
|
||||
@@ -50,6 +50,9 @@ Parser::Parser(Preprocessor &pp, Sema &actions)
|
||||
|
||||
WeakHandler.reset(new PragmaWeakHandler(actions));
|
||||
PP.AddPragmaHandler(WeakHandler.get());
|
||||
|
||||
FPContractHandler.reset(new PragmaFPContractHandler(actions, *this));
|
||||
PP.AddPragmaHandler("STDC", FPContractHandler.get());
|
||||
|
||||
PP.setCodeCompletionHandler(*this);
|
||||
}
|
||||
@@ -360,6 +363,8 @@ Parser::~Parser() {
|
||||
UnusedHandler.reset();
|
||||
PP.RemovePragmaHandler(WeakHandler.get());
|
||||
WeakHandler.reset();
|
||||
PP.RemovePragmaHandler("STDC", FPContractHandler.get());
|
||||
FPContractHandler.reset();
|
||||
PP.clearCodeCompletionHandler();
|
||||
}
|
||||
|
||||
|
||||
@@ -131,7 +131,7 @@ void Sema::ActOnTranslationUnitScope(Scope *S) {
|
||||
Sema::Sema(Preprocessor &pp, ASTContext &ctxt, ASTConsumer &consumer,
|
||||
bool CompleteTranslationUnit,
|
||||
CodeCompleteConsumer *CodeCompleter)
|
||||
: TheTargetAttributesSema(0),
|
||||
: TheTargetAttributesSema(0), FPFeatures(pp.getLangOptions()),
|
||||
LangOpts(pp.getLangOptions()), PP(pp), Context(ctxt), Consumer(consumer),
|
||||
Diags(PP.getDiagnostics()), SourceMgr(PP.getSourceManager()),
|
||||
ExternalSource(0), CodeCompleter(CodeCompleter), CurContext(0),
|
||||
|
||||
@@ -350,6 +350,20 @@ void Sema::ActOnPragmaVisibility(bool IsPush, const IdentifierInfo* VisType,
|
||||
}
|
||||
}
|
||||
|
||||
void Sema::ActOnPragmaFPContract(tok::OnOffSwitch OOS) {
|
||||
switch (OOS) {
|
||||
case tok::OOS_ON:
|
||||
FPFeatures.fp_contract = 1;
|
||||
break;
|
||||
case tok::OOS_OFF:
|
||||
FPFeatures.fp_contract = 0;
|
||||
break;
|
||||
case tok::OOS_DEFAULT:
|
||||
FPFeatures.fp_contract = getLangOptions().DefaultFPContract;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void Sema::PushNamespaceVisibilityAttr(const VisibilityAttr *Attr) {
|
||||
// Visibility calculations will consider the namespace's visibility.
|
||||
// Here we just want to note that we're in a visibility context
|
||||
|
||||
Reference in New Issue
Block a user