From e289d81369914678db386f6aa86faf8f178e245d Mon Sep 17 00:00:00 2001 From: Douglas Gregor Date: Tue, 13 Sep 2011 17:21:33 +0000 Subject: [PATCH] Switch LangOptions over to a .def file that describes header of the language options. Use that .def file to declare the LangOptions class and initialize all of its members, eliminating a source of annoying initialization bugs. AST serialization changes are next up. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@139605 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Basic/LangOptions.def | 148 ++++++++++ include/clang/Basic/LangOptions.h | 259 ++---------------- lib/AST/ASTContext.cpp | 2 +- lib/Basic/CMakeLists.txt | 1 + lib/Basic/LangOptions.cpp | 21 ++ lib/Basic/Targets.cpp | 2 +- lib/CodeGen/CGBlocks.cpp | 2 +- lib/CodeGen/CGDecl.cpp | 2 +- lib/CodeGen/CGExpr.cpp | 6 +- lib/CodeGen/CGExprAgg.cpp | 4 +- lib/CodeGen/CGObjC.cpp | 8 +- lib/CodeGen/CGObjCGNU.cpp | 10 +- lib/CodeGen/CGObjCMac.cpp | 12 +- lib/CodeGen/CodeGenModule.cpp | 4 +- lib/Frontend/CompilerInvocation.cpp | 20 +- lib/Frontend/InitPreprocessor.cpp | 6 +- lib/Sema/SemaDecl.cpp | 4 +- lib/Sema/SemaObjCProperty.cpp | 22 +- lib/Serialization/ASTReader.cpp | 12 +- lib/Serialization/ASTWriter.cpp | 4 +- .../Checkers/CheckObjCDealloc.cpp | 12 +- .../Checkers/NSAutoreleasePoolChecker.cpp | 2 +- .../Checkers/RetainCountChecker.cpp | 6 +- .../Frontend/AnalysisConsumer.cpp | 2 +- 24 files changed, 269 insertions(+), 302 deletions(-) create mode 100644 include/clang/Basic/LangOptions.def create mode 100644 lib/Basic/LangOptions.cpp diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def new file mode 100644 index 0000000000..bc559d8098 --- /dev/null +++ b/include/clang/Basic/LangOptions.def @@ -0,0 +1,148 @@ +//===--- LangOptions.def - Language option database --------------- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the language options. Users of this file must +// define the LANGOPT macro to make use of this information. +// Optionally, the user may also define BENIGN_LANGOPT +// (for options that don't affect the construction of the AST in an +// incompatible way), ENUM_LANGOPT (for options that have enumeration, +// rather than unsigned, type), and BENIGN_ENUM_LANGOPT (for benign +// options that have enumeration type). +// +//===----------------------------------------------------------------------===// +#ifndef LANGOPT +# error Define the LANGOPT macro to handle language options +#endif + +#ifndef BENIGN_LANGOPT +# define BENIGN_LANGOPT(Name, Bits, Default, Description) \ + LANGOPT(Name, Bits, Default, Description) +#endif + +#ifndef ENUM_LANGOPT +# define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + LANGOPT(Name, Bits, Default, Description) +#endif + +#ifndef BENIGN_ENUM_LANGOPT +# define BENIGN_ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + ENUM_LANGOPT(Name, Type, Bits, Default, Description) +#endif + +LANGOPT(Trigraphs , 1, 0,"Trigraphs in source files") +LANGOPT(BCPLComment , 1, 0, "BCPL-style '//' comments") +LANGOPT(Bool , 1, 0, "'bool', 'true', 'false' keywords") +BENIGN_LANGOPT(DollarIdents , 1, 0, "'$' allowed in identifiers") +BENIGN_LANGOPT(AsmPreprocessor , 1, 0, "Preprocessor in asm mode") +BENIGN_LANGOPT(GNUMode , 1, 0, "True in gnu99 mode false in c99 mode (etc)") +LANGOPT(GNUKeywords , 1, 0, "True if GNU-only keywords are allowed") +BENIGN_LANGOPT(ImplicitInt , 1, 0, "C89 implicit 'int'") +LANGOPT(Digraphs , 1, 0, "C94, C99 and C++") +BENIGN_LANGOPT(HexFloats , 1, 0, "C99 Hexadecimal float constants") +LANGOPT(C99 , 1, 0, "C99 Support") +LANGOPT(C1X , 1, 0, "C1X Support") +LANGOPT(Microsoft , 1, 0, "Microsoft extensions") +LANGOPT(Borland , 1, 0, "Borland extensions") +LANGOPT(CPlusPlus , 1, 0, "C++ Support") +LANGOPT(CPlusPlus0x , 1, 0, "C++0x Support") +LANGOPT(CXXOperatorNames , 1, 0, "Treat C++ operator names as keywords") +LANGOPT(ObjC1 , 1, 0, "Objective-C 1 support enabled") +LANGOPT(ObjC2 , 1, 0, "Objective-C 2 support enabled") +LANGOPT(ObjCNonFragileABI , 1, 0, "Objective-C modern abi enabled") +LANGOPT(ObjCNonFragileABI2 , 1, 0, "Objective-C enhanced modern abi enabled") +BENIGN_LANGOPT(ObjCDefaultSynthProperties , 1, 0, + "Objective-C auto-synthesized properties") +BENIGN_LANGOPT(ObjCInferRelatedResultType , 1, 1, + "Infer Objective-C related return types") +LANGOPT(AppleKext , 1, 0, "Allow apple kext features") +BENIGN_LANGOPT(PascalStrings , 1, 0, "Allow Pascal strings") +LANGOPT(WritableStrings , 1, 0, "Allow writable strings") +LANGOPT(ConstStrings , 1, 0, + "Add const qualifier to strings (-Wwrite-strings)") +LANGOPT(LaxVectorConversions , 1, 1, "Supprt lax vector conversions") +LANGOPT(AltiVec , 1, 0, "Support AltiVec-style vector initializers") +LANGOPT(Exceptions , 1, 0, "Support exception handling") +LANGOPT(ObjCExceptions , 1, 0, "Support Objective-C exceptions") +LANGOPT(CXXExceptions , 1, 0, "Support C++ exceptions") +LANGOPT(SjLjExceptions , 1, 0, "Use setjmp-longjump exception handling") +LANGOPT(TraditionalCPP , 1, 0, "Enable some traditional CPP emulation") +LANGOPT(RTTI , 1, 1, "Support RTTI information") +LANGOPT(MSBitfields , 1, 0, "MS-compatible structure layout") +LANGOPT(NeXTRuntime , 1, 1, "Use NeXT runtime") +BENIGN_LANGOPT(Freestanding , 1, 0, "Freestanding implementation") +LANGOPT(NoBuiltin , 1, 0, "Do not use builtin functions (-fno-builtin)") + +BENIGN_LANGOPT(ThreadsafeStatics , 1, 1, "Whether static initializers are protected by locks") +LANGOPT(POSIXThreads , 1, 0, "Compiling with POSIX thread support") +BENIGN_LANGOPT(Blocks , 1, 0, "Support blocks extension to C") +BENIGN_LANGOPT(EmitAllDecls , 1, 0, "Emit all declarations, even if they are unused") +LANGOPT(MathErrno , 1, 1, "Math functions must respect errno (modulo the platform support)") +BENIGN_LANGOPT(HeinousExtensions , 1, 0, "Extensions that we really don't like and may be ripped out at any time") + +LANGOPT(Optimize , 1, 0, "Whether __OPTIMIZE__ should be defined") +LANGOPT(OptimizeSize , 1, 0, "Whether __OPTIMIZE_SIZE__ should be defined") +LANGOPT(Static , 1, 0, "Should __STATIC__ be defined (as opposed to __DYNAMIC__)") +LANGOPT(PICLevel , 2, 0, "The value for __PIC__, if non-zero") +LANGOPT(GNUInline , 1, 0, "Should GNU inline semantics be used (instead of C99 semantics)") +LANGOPT(NoInline , 1, 0, "Should __NO_INLINE__ be defined") +LANGOPT(Deprecated , 1, 0, "Should __DEPRECATED be defined") + +LANGOPT(ObjCGCBitmapPrint , 1, 0, "Enable printing of gc's bitmap layout for __weak/__strong ivars") + +BENIGN_LANGOPT(AccessControl , 1, 1, "Whether C++ access control should be enabled") +LANGOPT(CharIsSigned , 1, 1, "Whether char is a signed or unsigned type") +LANGOPT(ShortWChar , 1, 0, "Force wchar_t to be unsigned short int") + +LANGOPT(ShortEnums , 1, 0, "The enum type will be equivalent to the smallest integer type with enough room") + +LANGOPT(OpenCL , 1, 0, "OpenCL C99 language extensions") +LANGOPT(CUDA , 1, 0, "CUDA C++ language extensions") + +LANGOPT(AssumeSaneOperatorNew , 1, 1, "Whether to add __attribute__((malloc)) to the declaration of C++'s new operators") +BENIGN_LANGOPT(ElideConstructors , 1, 1, "Whether C++ copy constructors should be elided if possible") +BENIGN_LANGOPT(CatchUndefined , 1, 0, "Generate code to check for undefined ops") +BENIGN_LANGOPT(DumpRecordLayouts , 1, 0, "Dump the layout of IRgen'd records") +BENIGN_LANGOPT(DumpVTableLayouts , 1, 0, "Dump the layouts of emitted vtables") +LANGOPT(NoConstantCFStrings , 1, 0, "Do not do CF strings") +LANGOPT(InlineVisibilityHidden , 1, 0, "Whether inline C++ methods have hidden visibility by default") +BENIGN_LANGOPT(ParseUnknownAnytype, 1, 0, "Let the user write __unknown_anytype") +BENIGN_LANGOPT(DebuggerSupport , 1, 0, "Do things that only make sense when supporting a debugger") + +BENIGN_LANGOPT(SpellChecking , 1, 1, "Whether to perform spell-checking for error recovery") +LANGOPT(SinglePrecisionConstants , 1, 0, "Whether to treat double-precision floating point constants as single precision constants") +LANGOPT(FastRelaxedMath , 1, 0, "OpenCL fast relaxed math (on its own, defines __FAST_RELAXED_MATH__)") +LANGOPT(DefaultFPContract , 1, 0, "Default setting for FP_CONTRACT") +LANGOPT(NoBitFieldTypeAlign , 1, 0, "Temporary option, used for testing purposes") +LANGOPT(ObjCAutoRefCount , 1, 0, "Objective C automated reference counting") +LANGOPT(ObjCRuntimeHasWeak , 1, 0, "The ARC runtime supports __weak") +LANGOPT(FakeAddressSpaceMap , 1, 0, "Use a fake address space map, for testing languages such as OpenCL") + +LANGOPT(MRTD , 1, 0, "-mrtd calling convention") +BENIGN_LANGOPT(DelayedTemplateParsing , 1, 0, "Delayed template parsing") +LANGOPT(BlocksRuntimeOptional , 1, 0, "The blocks runtime is not guaranteed") + +ENUM_LANGOPT(GC, GCMode, 2, NonGC, "Objective-C Garbage Collection mode") +ENUM_LANGOPT(VisibilityMode, Visibility, 3, DefaultVisibility, + "symbol visibility") +ENUM_LANGOPT(StackProtector, StackProtectorMode, 2, SSPOff, + "Whether stack protectors are on") +ENUM_LANGOPT(SignedOverflowBehavior, SignedOverflowBehaviorTy, 2, SOB_Undefined, + "How to handle signed integer overflow.") + +BENIGN_LANGOPT(InstantiationDepth, 32, 1024, "Maximum template instantiation depth") +BENIGN_LANGOPT(NumLargeByValueCopy, 32, 0, + "Warn if parameter/return value is larger in bytes than this setting. 0 is no check.") +BENIGN_LANGOPT(MSCVersion, 32, 0, + "Version of Microsoft Visual C/C++ we are pretending to be") + +#undef LANGOPT +#undef BENIGN_LANGOPT +#undef ENUM_LANGOPT +#undef BENIGN_ENUM_LANGOPT + diff --git a/include/clang/Basic/LangOptions.h b/include/clang/Basic/LangOptions.h index eb91cf32ae..34d836a73e 100644 --- a/include/clang/Basic/LangOptions.h +++ b/include/clang/Basic/LangOptions.h @@ -19,253 +19,50 @@ namespace clang { +class OptionSignature; + /// LangOptions - This class keeps track of the various options that can be /// enabled, which controls the dialect of C that is accepted. class LangOptions { public: - unsigned Trigraphs : 1; // Trigraphs in source files. - unsigned BCPLComment : 1; // BCPL-style '//' comments. - unsigned Bool : 1; // 'bool', 'true', 'false' keywords. - unsigned DollarIdents : 1; // '$' allowed in identifiers. - unsigned AsmPreprocessor : 1; // Preprocessor in asm mode. - unsigned GNUMode : 1; // True in gnu99 mode false in c99 mode (etc) - unsigned GNUKeywords : 1; // True if GNU-only keywords are allowed - unsigned ImplicitInt : 1; // C89 implicit 'int'. - unsigned Digraphs : 1; // C94, C99 and C++ - unsigned HexFloats : 1; // C99 Hexadecimal float constants. - unsigned C99 : 1; // C99 Support - unsigned C1X : 1; // C1X Support - unsigned Microsoft : 1; // Microsoft extensions. - unsigned Borland : 1; // Borland extensions. - unsigned CPlusPlus : 1; // C++ Support - unsigned CPlusPlus0x : 1; // C++0x Support - unsigned CXXOperatorNames : 1; // Treat C++ operator names as keywords. - - unsigned ObjC1 : 1; // Objective-C 1 support enabled. - unsigned ObjC2 : 1; // Objective-C 2 support enabled. - unsigned ObjCNonFragileABI : 1; // Objective-C modern abi enabled - unsigned ObjCNonFragileABI2 : 1; // Objective-C enhanced modern abi enabled - unsigned ObjCDefaultSynthProperties : 1; // Objective-C auto-synthesized properties. - unsigned ObjCInferRelatedResultType : 1; // Infer Objective-C related return - // types - unsigned AppleKext : 1; // Allow apple kext features. - - unsigned PascalStrings : 1; // Allow Pascal strings - unsigned WritableStrings : 1; // Allow writable strings - unsigned ConstStrings : 1; // Add const qualifier to strings (-Wwrite-strings) - unsigned LaxVectorConversions : 1; - unsigned AltiVec : 1; // Support AltiVec-style vector initializers. - unsigned Exceptions : 1; // Support exception handling. - unsigned ObjCExceptions : 1; // Support Objective-C exceptions. - unsigned CXXExceptions : 1; // Support C++ exceptions. - unsigned SjLjExceptions : 1; // Use setjmp-longjump exception handling. - unsigned TraditionalCPP : 1; /// Enable some traditional CPP emulation. - unsigned RTTI : 1; // Support RTTI information. - - unsigned MSBitfields : 1; // MS-compatible structure layout - unsigned NeXTRuntime : 1; // Use NeXT runtime. - unsigned Freestanding : 1; // Freestanding implementation - unsigned NoBuiltin : 1; // Do not use builtin functions (-fno-builtin) - - unsigned ThreadsafeStatics : 1; // Whether static initializers are protected - // by locks. - unsigned POSIXThreads : 1; // Compiling with POSIX thread support - // (-pthread) - unsigned Blocks : 1; // block extension to C - unsigned EmitAllDecls : 1; // Emit all declarations, even if - // they are unused. - unsigned MathErrno : 1; // Math functions must respect errno - // (modulo the platform support). - - unsigned HeinousExtensions : 1; // Extensions that we really don't like and - // may be ripped out at any time. - - unsigned Optimize : 1; // Whether __OPTIMIZE__ should be defined. - unsigned OptimizeSize : 1; // Whether __OPTIMIZE_SIZE__ should be - // defined. - unsigned Static : 1; // Should __STATIC__ be defined (as - // opposed to __DYNAMIC__). - unsigned PICLevel : 2; // The value for __PIC__, if non-zero. - - unsigned GNUInline : 1; // Should GNU inline semantics be - // used (instead of C99 semantics). - unsigned NoInline : 1; // Should __NO_INLINE__ be defined. - - unsigned Deprecated : 1; // Should __DEPRECATED be defined. - - unsigned ObjCGCBitmapPrint : 1; // Enable printing of gc's bitmap layout - // for __weak/__strong ivars. - - unsigned AccessControl : 1; // Whether C++ access control should - // be enabled. - unsigned CharIsSigned : 1; // Whether char is a signed or unsigned type - unsigned ShortWChar : 1; // Force wchar_t to be unsigned short int. - - unsigned ShortEnums : 1; // The enum type will be equivalent to the - // smallest integer type with enough room. - - unsigned OpenCL : 1; // OpenCL C99 language extensions. - unsigned CUDA : 1; // CUDA C++ language extensions. - - unsigned AssumeSaneOperatorNew : 1; // Whether to add __attribute__((malloc)) - // to the declaration of C++'s new - // operators - unsigned ElideConstructors : 1; // Whether C++ copy constructors should be - // elided if possible. - unsigned CatchUndefined : 1; // Generate code to check for undefined ops. - unsigned DumpRecordLayouts : 1; /// Dump the layout of IRgen'd records. - unsigned DumpVTableLayouts : 1; /// Dump the layouts of emitted vtables. - unsigned NoConstantCFStrings : 1; // Do not do CF strings - unsigned InlineVisibilityHidden : 1; // Whether inline C++ methods have - // hidden visibility by default. - unsigned ParseUnknownAnytype: 1; /// Let the user write __unknown_anytype. - unsigned DebuggerSupport : 1; /// Do things that only make sense when - /// supporting a debugger - - unsigned SpellChecking : 1; // Whether to perform spell-checking for error - // recovery. - unsigned SinglePrecisionConstants : 1; // Whether to treat double-precision - // floating point constants as - // 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; - unsigned ObjCAutoRefCount : 1; // Objective C automated reference counting - unsigned ObjCRuntimeHasWeak : 1; // The ARC runtime supports __weak - unsigned FakeAddressSpaceMap : 1; // Use a fake address space map, for - // testing languages such as OpenCL. - - unsigned MRTD : 1; // -mrtd calling convention - unsigned DelayedTemplateParsing : 1; // Delayed template parsing - unsigned BlocksRuntimeOptional : 1; // The blocks runtime is not guaranteed - -private: - // We declare multibit enums as unsigned because MSVC insists on making enums - // signed. Set/Query these values using accessors. - unsigned GC : 2; // Objective-C Garbage Collection modes. - unsigned SymbolVisibility : 3; // Symbol's visibility. - unsigned StackProtector : 2; // Whether stack protectors are on. - unsigned SignedOverflowBehavior : 2; // How to handle signed integer overflow. - -public: - unsigned InstantiationDepth; // Maximum template instantiation depth. - unsigned NumLargeByValueCopy; // Warn if parameter/return value is larger - // in bytes than this setting. 0 is no check. - - // Version of Microsoft Visual C/C++ we are pretending to be. This is - // temporary until we support all MS extensions used in Windows SDK and stdlib - // headers. Sets _MSC_VER. - unsigned MSCVersion; - - std::string ObjCConstantStringClass; - enum GCMode { NonGC, GCOnly, HybridGC }; enum StackProtectorMode { SSPOff, SSPOn, SSPReq }; - + enum SignedOverflowBehaviorTy { SOB_Undefined, // Default C standard behavior. SOB_Defined, // -fwrapv SOB_Trapping // -ftrapv }; + + // Define simple language options (with no accessors). +#define LANGOPT(Name, Bits, Default, Description) unsigned Name : Bits; +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) +#include "clang/Basic/LangOptions.def" + +private: + // Define language options of enumeration type. These are private, and will + // have accessors (below). +#define LANGOPT(Name, Bits, Default, Description) +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + unsigned Name : Bits; +#include "clang/Basic/LangOptions.def" + +public: + std::string ObjCConstantStringClass; + /// The name of the handler function to be called when -ftrapv is specified. /// If none is specified, abort (GCC-compatible behaviour). std::string OverflowHandler; - LangOptions() { - Trigraphs = BCPLComment = Bool = DollarIdents = AsmPreprocessor = 0; - GNUMode = GNUKeywords = ImplicitInt = Digraphs = 0; - HexFloats = 0; - ObjCAutoRefCount = 0; - ObjCRuntimeHasWeak = 0; - GC = ObjC1 = ObjC2 = ObjCNonFragileABI = ObjCNonFragileABI2 = 0; - AppleKext = 0; - ObjCDefaultSynthProperties = 0; - ObjCInferRelatedResultType = 1; - NoConstantCFStrings = 0; InlineVisibilityHidden = 0; - C99 = C1X = Microsoft = Borland = CPlusPlus = CPlusPlus0x = 0; - CXXOperatorNames = PascalStrings = WritableStrings = ConstStrings = 0; - Exceptions = ObjCExceptions = CXXExceptions = SjLjExceptions = 0; - TraditionalCPP = Freestanding = NoBuiltin = 0; - MSBitfields = 0; - NeXTRuntime = 1; - RTTI = 1; - LaxVectorConversions = 1; - HeinousExtensions = 0; - AltiVec = OpenCL = CUDA = StackProtector = 0; - - SymbolVisibility = (unsigned) DefaultVisibility; - - ThreadsafeStatics = 1; - POSIXThreads = 0; - Blocks = BlocksRuntimeOptional = 0; - EmitAllDecls = 0; - MathErrno = 1; - SignedOverflowBehavior = SOB_Undefined; - - AssumeSaneOperatorNew = 1; - AccessControl = 1; - ElideConstructors = 1; - - SignedOverflowBehavior = 0; - ObjCGCBitmapPrint = 0; - - InstantiationDepth = 1024; - - NumLargeByValueCopy = 0; - MSCVersion = 0; - - Optimize = 0; - OptimizeSize = 0; - - Static = 0; - PICLevel = 0; - - GNUInline = 0; - NoInline = 0; - - Deprecated = 0; - - CharIsSigned = 1; - ShortWChar = 0; - ShortEnums = 0; - CatchUndefined = 0; - DumpRecordLayouts = 0; - DumpVTableLayouts = 0; - SpellChecking = 1; - SinglePrecisionConstants = 0; - FastRelaxedMath = 0; - DefaultFPContract = 0; - NoBitFieldTypeAlign = 0; - FakeAddressSpaceMap = 0; - MRTD = 0; - DelayedTemplateParsing = 0; - ParseUnknownAnytype = DebuggerSupport = 0; - } - - GCMode getGCMode() const { return (GCMode) GC; } - void setGCMode(GCMode m) { GC = (unsigned) m; } - - StackProtectorMode getStackProtectorMode() const { - return static_cast(StackProtector); - } - void setStackProtectorMode(StackProtectorMode m) { - StackProtector = static_cast(m); - } - - Visibility getVisibilityMode() const { - return (Visibility) SymbolVisibility; - } - void setVisibilityMode(Visibility v) { SymbolVisibility = (unsigned) v; } - - SignedOverflowBehaviorTy getSignedOverflowBehavior() const { - return (SignedOverflowBehaviorTy)SignedOverflowBehavior; - } - void setSignedOverflowBehavior(SignedOverflowBehaviorTy V) { - SignedOverflowBehavior = (unsigned)V; - } + LangOptions(); + // Define accessors/mutators for language options of enumeration type. +#define LANGOPT(Name, Bits, Default, Description) +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) \ + Type get##Name() const { return static_cast(Name); } \ + void set##Name(Type Value) { Name = static_cast(Value); } +#include "clang/Basic/LangOptions.def" + bool isSignedOverflowDefined() const { return getSignedOverflowBehavior() == SOB_Defined; } diff --git a/lib/AST/ASTContext.cpp b/lib/AST/ASTContext.cpp index e3a6f4a86f..8131c4b163 100644 --- a/lib/AST/ASTContext.cpp +++ b/lib/AST/ASTContext.cpp @@ -4930,7 +4930,7 @@ CanQualType ASTContext::getFromTargetType(unsigned Type) const { /// garbage collection attribute. /// Qualifiers::GC ASTContext::getObjCGCAttrKind(QualType Ty) const { - if (getLangOptions().getGCMode() == LangOptions::NonGC) + if (getLangOptions().getGC() == LangOptions::NonGC) return Qualifiers::GCNone; assert(getLangOptions().ObjC1); diff --git a/lib/Basic/CMakeLists.txt b/lib/Basic/CMakeLists.txt index c1e7cf6bf9..ff348896e3 100644 --- a/lib/Basic/CMakeLists.txt +++ b/lib/Basic/CMakeLists.txt @@ -8,6 +8,7 @@ add_clang_library(clangBasic FileManager.cpp FileSystemStatCache.cpp IdentifierTable.cpp + LangOptions.cpp SourceLocation.cpp SourceManager.cpp TargetInfo.cpp diff --git a/lib/Basic/LangOptions.cpp b/lib/Basic/LangOptions.cpp new file mode 100644 index 0000000000..d29f7774dc --- /dev/null +++ b/lib/Basic/LangOptions.cpp @@ -0,0 +1,21 @@ +//===--- LangOptions.cpp - C Language Family Language Options ---*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file defines the LangOptions class. +// +//===----------------------------------------------------------------------===// +#include "clang/Basic/LangOptions.h" + +using namespace clang; + +LangOptions::LangOptions() { +#define LANGOPT(Name, Bits, Default, Description) Name = Default; +#define ENUM_LANGOPT(Name, Type, Bits, Default, Description) set##Name(Default); +#include "clang/Basic/LangOptions.def" +} diff --git a/lib/Basic/Targets.cpp b/lib/Basic/Targets.cpp index 206ff65df5..6a6030f518 100644 --- a/lib/Basic/Targets.cpp +++ b/lib/Basic/Targets.cpp @@ -89,7 +89,7 @@ static void getDarwinDefines(MacroBuilder &Builder, const LangOptions &Opts, Builder.defineMacro("__weak", "__attribute__((objc_gc(weak)))"); // Darwin defines __strong even in C mode (just to nothing). - if (Opts.getGCMode() != LangOptions::NonGC) + if (Opts.getGC() != LangOptions::NonGC) Builder.defineMacro("__strong", "__attribute__((objc_gc(strong)))"); else Builder.defineMacro("__strong", ""); diff --git a/lib/CodeGen/CGBlocks.cpp b/lib/CodeGen/CGBlocks.cpp index fd93255e5c..1e9fae0aae 100644 --- a/lib/CodeGen/CGBlocks.cpp +++ b/lib/CodeGen/CGBlocks.cpp @@ -1804,7 +1804,7 @@ namespace { /// to be done externally. void CodeGenFunction::enterByrefCleanup(const AutoVarEmission &emission) { // We don't enter this cleanup if we're in pure-GC mode. - if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly) + if (CGM.getLangOptions().getGC() == LangOptions::GCOnly) return; EHStack.pushCleanup(NormalAndEHCleanup, emission.Address); diff --git a/lib/CodeGen/CGDecl.cpp b/lib/CodeGen/CGDecl.cpp index 9ecc72781c..78a1101ce1 100644 --- a/lib/CodeGen/CGDecl.cpp +++ b/lib/CodeGen/CGDecl.cpp @@ -1120,7 +1120,7 @@ void CodeGenFunction::EmitAutoVarCleanups(const AutoVarEmission &emission) { emitAutoVarTypeCleanup(emission, dtorKind); // In GC mode, honor objc_precise_lifetime. - if (getLangOptions().getGCMode() != LangOptions::NonGC && + if (getLangOptions().getGC() != LangOptions::NonGC && D.hasAttr()) { EHStack.pushCleanup(NormalCleanup, &D); } diff --git a/lib/CodeGen/CGExpr.cpp b/lib/CodeGen/CGExpr.cpp index d6ceef5e38..f4c552b085 100644 --- a/lib/CodeGen/CGExpr.cpp +++ b/lib/CodeGen/CGExpr.cpp @@ -1212,7 +1212,7 @@ void CodeGenFunction::EmitStoreThroughExtVectorComponentLValue(RValue Src, // or neither. static void setObjCGCLValueClass(const ASTContext &Ctx, const Expr *E, LValue &LV) { - if (Ctx.getLangOptions().getGCMode() == LangOptions::NonGC) + if (Ctx.getLangOptions().getGC() == LangOptions::NonGC) return; if (isa(E)) { @@ -1419,7 +1419,7 @@ LValue CodeGenFunction::EmitUnaryOpLValue(const UnaryOperator *E) { // But, we continue to generate __strong write barrier on indirect write // into a pointer to object. if (getContext().getLangOptions().ObjC1 && - getContext().getLangOptions().getGCMode() != LangOptions::NonGC && + getContext().getLangOptions().getGC() != LangOptions::NonGC && LV.isObjCWeak()) LV.setNonGC(!E->isOBJCGCCandidate(getContext())); return LV; @@ -1680,7 +1680,7 @@ LValue CodeGenFunction::EmitArraySubscriptExpr(const ArraySubscriptExpr *E) { LV.getQuals().setAddressSpace(E->getBase()->getType().getAddressSpace()); if (getContext().getLangOptions().ObjC1 && - getContext().getLangOptions().getGCMode() != LangOptions::NonGC) { + getContext().getLangOptions().getGC() != LangOptions::NonGC) { LV.setNonGC(!E->isOBJCGCCandidate(getContext())); setObjCGCLValueClass(getContext(), E, LV); } diff --git a/lib/CodeGen/CGExprAgg.cpp b/lib/CodeGen/CGExprAgg.cpp index f965cf7e3f..856378b34f 100644 --- a/lib/CodeGen/CGExprAgg.cpp +++ b/lib/CodeGen/CGExprAgg.cpp @@ -79,7 +79,7 @@ public: void EmitMoveFromReturnSlot(const Expr *E, RValue Src); AggValueSlot::NeedsGCBarriers_t needsGC(QualType T) { - if (CGF.getLangOptions().getGCMode() && TypeRequiresGCollection(T)) + if (CGF.getLangOptions().getGC() && TypeRequiresGCollection(T)) return AggValueSlot::NeedsGCBarriers; return AggValueSlot::DoesNotNeedGCBarriers; } @@ -1123,7 +1123,7 @@ void CodeGenFunction::EmitAggregateCopy(llvm::Value *DestPtr, SrcPtr = Builder.CreateBitCast(SrcPtr, SBP, "tmp"); // Don't do any of the memmove_collectable tests if GC isn't set. - if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC) { + if (CGM.getLangOptions().getGC() == LangOptions::NonGC) { // fall through } else if (const RecordType *RecordTy = Ty->getAs()) { RecordDecl *Record = RecordTy->getDecl(); diff --git a/lib/CodeGen/CGObjC.cpp b/lib/CodeGen/CGObjC.cpp index ddf6e1f98a..1572b4b3cf 100644 --- a/lib/CodeGen/CGObjC.cpp +++ b/lib/CodeGen/CGObjC.cpp @@ -465,7 +465,7 @@ PropertyImplStrategy::PropertyImplStrategy(CodeGenModule &CGM, if (attrs & (ObjCPropertyDecl::OBJC_PR_retain | ObjCPropertyDecl::OBJC_PR_strong)) { // In GC-only, there's nothing special that needs to be done. - if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly) { + if (CGM.getLangOptions().getGC() == LangOptions::GCOnly) { // fallthrough // In ARC, if the property is non-atomic, use expression emission, @@ -506,14 +506,14 @@ PropertyImplStrategy::PropertyImplStrategy(CodeGenModule &CGM, // expressions. This actually works out to being atomic anyway, // except for ARC __strong, but that should trigger the above code. if (ivarType.hasNonTrivialObjCLifetime() || - (CGM.getLangOptions().getGCMode() && + (CGM.getLangOptions().getGC() && CGM.getContext().getObjCGCAttrKind(ivarType))) { Kind = Expression; return; } // Compute whether the ivar has strong members. - if (CGM.getLangOptions().getGCMode()) + if (CGM.getLangOptions().getGC()) if (const RecordType *recordType = ivarType->getAs()) HasStrong = recordType->getDecl()->hasObjectMember(); @@ -1066,7 +1066,7 @@ bool CodeGenFunction::IndirectObjCSetterArg(const CGFunctionInfo &FI) { } bool CodeGenFunction::IvarTypeWithAggrGCObjects(QualType Ty) { - if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC) + if (CGM.getLangOptions().getGC() == LangOptions::NonGC) return false; if (const RecordType *FDTTy = Ty.getTypePtr()->getAs()) return FDTTy->getDecl()->hasObjectMember(); diff --git a/lib/CodeGen/CGObjCGNU.cpp b/lib/CodeGen/CGObjCGNU.cpp index 857351b8fe..ae05c3947b 100644 --- a/lib/CodeGen/CGObjCGNU.cpp +++ b/lib/CodeGen/CGObjCGNU.cpp @@ -743,11 +743,11 @@ CGObjCGNU::CGObjCGNU(CodeGenModule &cgm, unsigned runtimeABIVersion, true)); const LangOptions &Opts = CGM.getLangOptions(); - if ((Opts.getGCMode() != LangOptions::NonGC) || Opts.ObjCAutoRefCount) + if ((Opts.getGC() != LangOptions::NonGC) || Opts.ObjCAutoRefCount) RuntimeVersion = 10; // Don't bother initialising the GC stuff unless we're compiling in GC mode - if (Opts.getGCMode() != LangOptions::NonGC) { + if (Opts.getGC() != LangOptions::NonGC) { // This is a bit of an hack. We should sort this out by having a proper // CGObjCGNUstep subclass for GC, but we may want to really support the old // ABI and GC added in ObjectiveC2.framework, so we fudge it a bit for now @@ -970,7 +970,7 @@ CGObjCGNU::GenerateMessageSendSuper(CodeGenFunction &CGF, const CallArgList &CallArgs, const ObjCMethodDecl *Method) { CGBuilderTy &Builder = CGF.Builder; - if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly) { + if (CGM.getLangOptions().getGC() == LangOptions::GCOnly) { if (Sel == RetainSel || Sel == AutoreleaseSel) { return RValue::get(EnforceType(Builder, Receiver, CGM.getTypes().ConvertType(ResultType))); @@ -1078,7 +1078,7 @@ CGObjCGNU::GenerateMessageSend(CodeGenFunction &CGF, CGBuilderTy &Builder = CGF.Builder; // Strip out message sends to retain / release in GC mode - if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly) { + if (CGM.getLangOptions().getGC() == LangOptions::GCOnly) { if (Sel == RetainSel || Sel == AutoreleaseSel) { return RValue::get(EnforceType(Builder, Receiver, CGM.getTypes().ConvertType(ResultType))); @@ -2169,7 +2169,7 @@ llvm::Function *CGObjCGNU::ModuleInitFunction() { Elements.push_back(SymTab); if (RuntimeVersion >= 10) - switch (CGM.getLangOptions().getGCMode()) { + switch (CGM.getLangOptions().getGC()) { case LangOptions::GCOnly: Elements.push_back(llvm::ConstantInt::get(IntTy, 2)); break; diff --git a/lib/CodeGen/CGObjCMac.cpp b/lib/CodeGen/CGObjCMac.cpp index fa49f1e09f..665b7f97c2 100644 --- a/lib/CodeGen/CGObjCMac.cpp +++ b/lib/CodeGen/CGObjCMac.cpp @@ -1605,7 +1605,7 @@ llvm::Constant *CGObjCCommonMac::BuildGCBlockLayout(CodeGenModule &CGM, llvm::Constant *nullPtr = llvm::Constant::getNullValue(llvm::Type::getInt8PtrTy(VMContext)); - if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC && + if (CGM.getLangOptions().getGC() == LangOptions::NonGC && !CGM.getLangOptions().ObjCAutoRefCount) return nullPtr; @@ -3384,9 +3384,9 @@ void CGObjCCommonMac::EmitImageInfo() { unsigned flags = 0; // FIXME: Fix and continue? - if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC) + if (CGM.getLangOptions().getGC() != LangOptions::NonGC) flags |= eImageInfo_GarbageCollected; - if (CGM.getLangOptions().getGCMode() == LangOptions::GCOnly) + if (CGM.getLangOptions().getGC() == LangOptions::GCOnly) flags |= eImageInfo_GCOnly; // We never allow @synthesize of a superclass property. @@ -3890,7 +3890,7 @@ llvm::Constant *CGObjCCommonMac::BuildIvarLayout( bool hasUnion = false; llvm::Type *PtrTy = llvm::Type::getInt8PtrTy(VMContext); - if (CGM.getLangOptions().getGCMode() == LangOptions::NonGC && + if (CGM.getLangOptions().getGC() == LangOptions::NonGC && !CGM.getLangOptions().ObjCAutoRefCount) return llvm::Constant::getNullValue(PtrTy); @@ -4656,7 +4656,7 @@ bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) { // These are vtable-based if GC is disabled. // Optimistically use vtable dispatch for hybrid compiles. - if (CGM.getLangOptions().getGCMode() != LangOptions::GCOnly) { + if (CGM.getLangOptions().getGC() != LangOptions::GCOnly) { VTableDispatchMethods.insert(GetNullarySelector("retain")); VTableDispatchMethods.insert(GetNullarySelector("release")); VTableDispatchMethods.insert(GetNullarySelector("autorelease")); @@ -4672,7 +4672,7 @@ bool CGObjCNonFragileABIMac::isVTableDispatchedSelector(Selector Sel) { // These are vtable-based if GC is enabled. // Optimistically use vtable dispatch for hybrid compiles. - if (CGM.getLangOptions().getGCMode() != LangOptions::NonGC) { + if (CGM.getLangOptions().getGC() != LangOptions::NonGC) { VTableDispatchMethods.insert(GetNullarySelector("hash")); VTableDispatchMethods.insert(GetUnarySelector("addObject")); diff --git a/lib/CodeGen/CodeGenModule.cpp b/lib/CodeGen/CodeGenModule.cpp index 67757a22c5..7a946cb9d5 100644 --- a/lib/CodeGen/CodeGenModule.cpp +++ b/lib/CodeGen/CodeGenModule.cpp @@ -473,9 +473,9 @@ void CodeGenModule::SetLLVMFunctionAttributesForDefinition(const Decl *D, if (isa(D) || isa(D)) F->setUnnamedAddr(true); - if (Features.getStackProtectorMode() == LangOptions::SSPOn) + if (Features.getStackProtector() == LangOptions::SSPOn) F->addFnAttr(llvm::Attribute::StackProtect); - else if (Features.getStackProtectorMode() == LangOptions::SSPReq) + else if (Features.getStackProtector() == LangOptions::SSPReq) F->addFnAttr(llvm::Attribute::StackProtectReq); unsigned alignment = D->getMaxAlignment() / Context.getCharWidth(); diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index e7b8854224..6c999caf24 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -713,11 +713,11 @@ static void LangOptsToArgs(const LangOptions &Opts, Res.push_back("-fshort-wchar"); if (!Opts.ElideConstructors) Res.push_back("-fno-elide-constructors"); - if (Opts.getGCMode() != LangOptions::NonGC) { - if (Opts.getGCMode() == LangOptions::HybridGC) { + if (Opts.getGC() != LangOptions::NonGC) { + if (Opts.getGC() == LangOptions::HybridGC) { Res.push_back("-fobjc-gc"); } else { - assert(Opts.getGCMode() == LangOptions::GCOnly && "Invalid GC mode!"); + assert(Opts.getGC() == LangOptions::GCOnly && "Invalid GC mode!"); Res.push_back("-fobjc-gc-only"); } } @@ -744,9 +744,9 @@ static void LangOptsToArgs(const LangOptions &Opts, if (Opts.InlineVisibilityHidden) Res.push_back("-fvisibility-inlines-hidden"); - if (Opts.getStackProtectorMode() != 0) { + if (Opts.getStackProtector() != 0) { Res.push_back("-stack-protector"); - Res.push_back(llvm::utostr(Opts.getStackProtectorMode())); + Res.push_back(llvm::utostr(Opts.getStackProtector())); } if (Opts.InstantiationDepth != DefaultLangOpts.InstantiationDepth) { Res.push_back("-ftemplate-depth"); @@ -1586,9 +1586,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, if (Opts.ObjC1) { if (Args.hasArg(OPT_fobjc_gc_only)) - Opts.setGCMode(LangOptions::GCOnly); + Opts.setGC(LangOptions::GCOnly); else if (Args.hasArg(OPT_fobjc_gc)) - Opts.setGCMode(LangOptions::HybridGC); + Opts.setGC(LangOptions::HybridGC); else if (Args.hasArg(OPT_fobjc_arc)) { Opts.ObjCAutoRefCount = 1; if (!Args.hasArg(OPT_fobjc_nonfragile_abi)) @@ -1737,9 +1737,9 @@ static void ParseLangArgs(LangOptions &Opts, ArgList &Args, InputKind IK, Diags.Report(diag::err_drv_invalid_value) << Args.getLastArg(OPT_stack_protector)->getAsString(Args) << SSP; break; - case 0: Opts.setStackProtectorMode(LangOptions::SSPOff); break; - case 1: Opts.setStackProtectorMode(LangOptions::SSPOn); break; - case 2: Opts.setStackProtectorMode(LangOptions::SSPReq); break; + case 0: Opts.setStackProtector(LangOptions::SSPOff); break; + case 1: Opts.setStackProtector(LangOptions::SSPOn); break; + case 2: Opts.setStackProtector(LangOptions::SSPReq); break; } } diff --git a/lib/Frontend/InitPreprocessor.cpp b/lib/Frontend/InitPreprocessor.cpp index d356c66c94..474de77f26 100644 --- a/lib/Frontend/InitPreprocessor.cpp +++ b/lib/Frontend/InitPreprocessor.cpp @@ -431,7 +431,7 @@ static void InitializePredefinedMacros(const TargetInfo &TI, Builder.defineMacro("OBJC_ZEROCOST_EXCEPTIONS"); } - if (LangOpts.getGCMode() != LangOptions::NonGC) + if (LangOpts.getGC() != LangOptions::NonGC) Builder.defineMacro("__OBJC_GC__"); if (LangOpts.NeXTRuntime) @@ -604,9 +604,9 @@ static void InitializePredefinedMacros(const TargetInfo &TI, int Dig = PickFP(&TI.getLongDoubleFormat(), -1/*FIXME*/, 17, 21, 33, 36); Builder.defineMacro("__DECIMAL_DIG__", Twine(Dig)); - if (LangOpts.getStackProtectorMode() == LangOptions::SSPOn) + if (LangOpts.getStackProtector() == LangOptions::SSPOn) Builder.defineMacro("__SSP__"); - else if (LangOpts.getStackProtectorMode() == LangOptions::SSPReq) + else if (LangOpts.getStackProtector() == LangOptions::SSPReq) Builder.defineMacro("__SSP_ALL__", "2"); if (FEOpts.ProgramAction == frontend::RewriteObjC) diff --git a/lib/Sema/SemaDecl.cpp b/lib/Sema/SemaDecl.cpp index 0c1e095ab4..96531d4145 100644 --- a/lib/Sema/SemaDecl.cpp +++ b/lib/Sema/SemaDecl.cpp @@ -4086,7 +4086,7 @@ void Sema::CheckVariableDeclaration(VarDecl *NewVD, if (NewVD->hasLocalStorage() && T.isObjCGCWeak() && !NewVD->hasAttr()) { - if (getLangOptions().getGCMode() != LangOptions::NonGC) + if (getLangOptions().getGC() != LangOptions::NonGC) Diag(NewVD->getLocation(), diag::warn_gc_attribute_weak_on_local); else Diag(NewVD->getLocation(), diag::warn_attribute_weak_on_local); @@ -8796,7 +8796,7 @@ void Sema::ActOnFields(Scope* S, } } else if (getLangOptions().ObjC1 && - getLangOptions().getGCMode() != LangOptions::NonGC && + getLangOptions().getGC() != LangOptions::NonGC && Record && !Record->hasObjectMember()) { if (FD->getType()->isObjCObjectPointerType() || FD->getType().isObjCGCStrong()) diff --git a/lib/Sema/SemaObjCProperty.cpp b/lib/Sema/SemaObjCProperty.cpp index 9f50dea233..fe5fc1a5a3 100644 --- a/lib/Sema/SemaObjCProperty.cpp +++ b/lib/Sema/SemaObjCProperty.cpp @@ -80,7 +80,7 @@ Decl *Sema::ActOnProperty(Scope *S, SourceLocation AtLoc, unsigned Attributes = ODS.getPropertyAttributes(); TypeSourceInfo *TSI = GetTypeForDeclarator(FD.D, S); QualType T = TSI->getType(); - if ((getLangOptions().getGCMode() != LangOptions::NonGC && + if ((getLangOptions().getGC() != LangOptions::NonGC && T.isObjCGCWeak()) || (getLangOptions().ObjCAutoRefCount && T.getObjCLifetime() == Qualifiers::OCL_Weak)) @@ -291,7 +291,7 @@ ObjCPropertyDecl *Sema::CreatePropertyDecl(Scope *S, // Issue a warning if property is 'assign' as default and its object, which is // gc'able conforms to NSCopying protocol - if (getLangOptions().getGCMode() != LangOptions::NonGC && + if (getLangOptions().getGC() != LangOptions::NonGC && isAssign && !(Attributes & ObjCDeclSpec::DQ_PR_assign)) if (const ObjCObjectPointerType *ObjPtrTy = T->getAs()) { @@ -597,7 +597,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, if ((kind & ObjCPropertyDecl::OBJC_PR_weak) && !getLangOptions().ObjCAutoRefCount && - getLangOptions().getGCMode() != LangOptions::NonGC) { + getLangOptions().getGC() != LangOptions::NonGC) { if (PropType.isObjCGCStrong()) { Diag(PropertyLoc, diag::err_gc_weak_property_strong_type); @@ -655,7 +655,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, if (kind & ObjCPropertyDecl::OBJC_PR_weak && !getLangOptions().ObjCAutoRefCount && - getLangOptions().getGCMode() == LangOptions::NonGC) { + getLangOptions().getGC() == LangOptions::NonGC) { Diag(PropertyLoc, diag::error_synthesize_weak_non_arc_or_gc); Diag(property->getLocation(), diag::note_property_declare); } @@ -724,7 +724,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, } // __weak is explicit. So it works on Canonical type. if ((PropType.isObjCGCWeak() && !IvarType.isObjCGCWeak() && - getLangOptions().getGCMode() != LangOptions::NonGC)) { + getLangOptions().getGC() != LangOptions::NonGC)) { Diag(PropertyLoc, diag::error_weak_property) << property->getDeclName() << Ivar->getDeclName(); Diag(Ivar->getLocation(), diag::note_ivar_decl); @@ -733,7 +733,7 @@ Decl *Sema::ActOnPropertyImplDecl(Scope *S, // Fall thru - see previous comment if ((property->getType()->isObjCObjectPointerType() || PropType.isObjCGCStrong()) && IvarType.isObjCGCWeak() && - getLangOptions().getGCMode() != LangOptions::NonGC) { + getLangOptions().getGC() != LangOptions::NonGC) { Diag(PropertyLoc, diag::error_strong_property) << property->getDeclName() << Ivar->getDeclName(); // Fall thru - see previous comment @@ -1364,7 +1364,7 @@ void Sema::AtomicPropertySetterGetterRules (ObjCImplDecl* IMPDecl, ObjCContainerDecl* IDecl) { // Rules apply in non-GC mode only - if (getLangOptions().getGCMode() != LangOptions::NonGC) + if (getLangOptions().getGC() != LangOptions::NonGC) return; for (ObjCContainerDecl::prop_iterator I = IDecl->prop_begin(), E = IDecl->prop_end(); @@ -1422,7 +1422,7 @@ Sema::AtomicPropertySetterGetterRules (ObjCImplDecl* IMPDecl, } void Sema::DiagnoseOwningPropertyGetterSynthesis(const ObjCImplementationDecl *D) { - if (getLangOptions().getGCMode() == LangOptions::GCOnly) + if (getLangOptions().getGC() == LangOptions::GCOnly) return; for (ObjCImplementationDecl::propimpl_iterator @@ -1739,11 +1739,11 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl, PropertyDecl->setPropertyAttributes(ObjCPropertyDecl::OBJC_PR_strong); else { // Skip this warning in gc-only mode. - if (getLangOptions().getGCMode() != LangOptions::GCOnly) + if (getLangOptions().getGC() != LangOptions::GCOnly) Diag(Loc, diag::warn_objc_property_no_assignment_attribute); // If non-gc code warn that this is likely inappropriate. - if (getLangOptions().getGCMode() == LangOptions::NonGC) + if (getLangOptions().getGC() == LangOptions::NonGC) Diag(Loc, diag::warn_objc_property_default_assign_on_object); } @@ -1755,7 +1755,7 @@ void Sema::CheckObjCPropertyAttributes(Decl *PDecl, if (!(Attributes & ObjCDeclSpec::DQ_PR_copy) &&!(Attributes & ObjCDeclSpec::DQ_PR_readonly) - && getLangOptions().getGCMode() == LangOptions::GCOnly + && getLangOptions().getGC() == LangOptions::GCOnly && PropertyTy->isBlockPointerType()) Diag(Loc, diag::warn_objc_property_copy_missing_on_block); } diff --git a/lib/Serialization/ASTReader.cpp b/lib/Serialization/ASTReader.cpp index 09aee48723..dc359c1a00 100644 --- a/lib/Serialization/ASTReader.cpp +++ b/lib/Serialization/ASTReader.cpp @@ -138,13 +138,13 @@ PCHValidator::ReadLanguageOptions(const LangOptions &LangOpts) { PARSE_LANGOPT_IMPORTANT(CharIsSigned, diag::warn_pch_char_signed); PARSE_LANGOPT_IMPORTANT(ShortWChar, diag::warn_pch_short_wchar); PARSE_LANGOPT_IMPORTANT(ShortEnums, diag::warn_pch_short_enums); - if ((PPLangOpts.getGCMode() != 0) != (LangOpts.getGCMode() != 0)) { + if ((PPLangOpts.getGC() != 0) != (LangOpts.getGC() != 0)) { Reader.Diag(diag::warn_pch_gc_mode) - << LangOpts.getGCMode() << PPLangOpts.getGCMode(); + << LangOpts.getGC() << PPLangOpts.getGC(); return true; } PARSE_LANGOPT_BENIGN(getVisibilityMode()); - PARSE_LANGOPT_IMPORTANT(getStackProtectorMode(), + PARSE_LANGOPT_IMPORTANT(getStackProtector(), diag::warn_pch_stack_protector); PARSE_LANGOPT_BENIGN(InstantiationDepth); PARSE_LANGOPT_IMPORTANT(OpenCL, diag::warn_pch_opencl); @@ -3049,10 +3049,10 @@ bool ASTReader::ParseLanguageOptions( PARSE_LANGOPT(CharIsSigned); PARSE_LANGOPT(ShortWChar); PARSE_LANGOPT(ShortEnums); - LangOpts.setGCMode((LangOptions::GCMode)Record[Idx++]); + LangOpts.setGC((LangOptions::GCMode)Record[Idx++]); LangOpts.setVisibilityMode((Visibility)Record[Idx++]); - LangOpts.setStackProtectorMode((LangOptions::StackProtectorMode) - Record[Idx++]); + LangOpts.setStackProtector((LangOptions::StackProtectorMode) + Record[Idx++]); PARSE_LANGOPT(InstantiationDepth); PARSE_LANGOPT(OpenCL); PARSE_LANGOPT(CUDA); diff --git a/lib/Serialization/ASTWriter.cpp b/lib/Serialization/ASTWriter.cpp index 5515f3b3ab..a3f0cf7b89 100644 --- a/lib/Serialization/ASTWriter.cpp +++ b/lib/Serialization/ASTWriter.cpp @@ -1122,9 +1122,9 @@ void ASTWriter::WriteLanguageOptions(const LangOptions &LangOpts) { Record.push_back(LangOpts.ShortEnums); // Should the enum type be equivalent // to the smallest integer type with // enough room. - Record.push_back(LangOpts.getGCMode()); + Record.push_back(LangOpts.getGC()); Record.push_back(LangOpts.getVisibilityMode()); - Record.push_back(LangOpts.getStackProtectorMode()); + Record.push_back(LangOpts.getStackProtector()); Record.push_back(LangOpts.InstantiationDepth); Record.push_back(LangOpts.OpenCL); Record.push_back(LangOpts.CUDA); diff --git a/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp b/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp index 48f5c8ba01..cb6c1c6280 100644 --- a/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp +++ b/lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp @@ -99,7 +99,7 @@ static bool scan_ivar_release(Stmt *S, ObjCIvarDecl *ID, static void checkObjCDealloc(const ObjCImplementationDecl *D, const LangOptions& LOpts, BugReporter& BR) { - assert (LOpts.getGCMode() != LangOptions::GCOnly); + assert (LOpts.getGC() != LangOptions::GCOnly); ASTContext &Ctx = BR.getContext(); const ObjCInterfaceDecl *ID = D->getClassInterface(); @@ -168,7 +168,7 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D, if (!MD) { // No dealloc found. - const char* name = LOpts.getGCMode() == LangOptions::NonGC + const char* name = LOpts.getGC() == LangOptions::NonGC ? "missing -dealloc" : "missing -dealloc (Hybrid MM, non-GC)"; @@ -183,7 +183,7 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D, // dealloc found. Scan for missing [super dealloc]. if (MD->getBody() && !scan_dealloc(MD->getBody(), S)) { - const char* name = LOpts.getGCMode() == LangOptions::NonGC + const char* name = LOpts.getGC() == LangOptions::NonGC ? "missing [super dealloc]" : "missing [super dealloc] (Hybrid MM, non-GC)"; @@ -240,7 +240,7 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D, llvm::raw_string_ostream os(buf); if (requiresRelease) { - name = LOpts.getGCMode() == LangOptions::NonGC + name = LOpts.getGC() == LangOptions::NonGC ? "missing ivar release (leak)" : "missing ivar release (Hybrid MM, non-GC)"; @@ -248,7 +248,7 @@ static void checkObjCDealloc(const ObjCImplementationDecl *D, << "' instance variable was retained by a synthesized property but " "wasn't released in 'dealloc'"; } else { - name = LOpts.getGCMode() == LangOptions::NonGC + name = LOpts.getGC() == LangOptions::NonGC ? "extra ivar release (use-after-release)" : "extra ivar release (Hybrid MM, non-GC)"; @@ -272,7 +272,7 @@ class ObjCDeallocChecker : public Checker< public: void checkASTDecl(const ObjCImplementationDecl *D, AnalysisManager& mgr, BugReporter &BR) const { - if (mgr.getLangOptions().getGCMode() == LangOptions::GCOnly) + if (mgr.getLangOptions().getGC() == LangOptions::GCOnly) return; checkObjCDealloc(cast(D), mgr.getLangOptions(), BR); } diff --git a/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp b/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp index db5312ddf6..b3b2f31a68 100644 --- a/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/NSAutoreleasePoolChecker.cpp @@ -75,6 +75,6 @@ void NSAutoreleasePoolChecker::checkPreObjCMessage(ObjCMessage msg, } void ento::registerNSAutoreleasePoolChecker(CheckerManager &mgr) { - if (mgr.getLangOptions().getGCMode() != LangOptions::NonGC) + if (mgr.getLangOptions().getGC() != LangOptions::NonGC) mgr.registerChecker(); } diff --git a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp index cf06f54c70..97151337a7 100644 --- a/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp +++ b/lib/StaticAnalyzer/Checkers/RetainCountChecker.cpp @@ -1772,7 +1772,7 @@ void CFRefReport::addGCModeDescription(const LangOptions &LOpts, bool GCEnabled) { const char *GCModeDescription = 0; - switch (LOpts.getGCMode()) { + switch (LOpts.getGC()) { case LangOptions::GCOnly: assert(GCEnabled); GCModeDescription = "Code is compiled to only use garbage collection"; @@ -2354,7 +2354,7 @@ public: return leakWithinFunctionGC.get(); } else { if (!leakWithinFunction) { - if (LOpts.getGCMode() == LangOptions::HybridGC) { + if (LOpts.getGC() == LangOptions::HybridGC) { leakWithinFunction.reset(new LeakWithinFunction("Leak of object when " "not using garbage " "collection (GC) in " @@ -2376,7 +2376,7 @@ public: return leakAtReturnGC.get(); } else { if (!leakAtReturn) { - if (LOpts.getGCMode() == LangOptions::HybridGC) { + if (LOpts.getGC() == LangOptions::HybridGC) { leakAtReturn.reset(new LeakAtReturn("Leak of returned object when " "not using garbage collection " "(GC) in dual GC/non-GC code")); diff --git a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp index 69a87fbd21..76ca477794 100644 --- a/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp +++ b/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp @@ -336,7 +336,7 @@ static void ActionExprEngine(AnalysisConsumer &C, AnalysisManager &mgr, static void RunPathSensitiveChecks(AnalysisConsumer &C, AnalysisManager &mgr, Decl *D) { - switch (mgr.getLangOptions().getGCMode()) { + switch (mgr.getLangOptions().getGC()) { default: llvm_unreachable("Invalid GC mode."); case LangOptions::NonGC: -- 2.40.0