mirror of
https://github.com/intel/llvm.git
synced 2026-01-25 10:55:58 +08:00
Switch CodeGenOptions over to a .def file, like we do with LangOptions.
llvm-svn: 166497
This commit is contained in:
135
clang/include/clang/Frontend/CodeGenOptions.def
Normal file
135
clang/include/clang/Frontend/CodeGenOptions.def
Normal file
@@ -0,0 +1,135 @@
|
||||
//===--- CodeGenOptions.def - Code generation 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 code generation options. Users of this file
|
||||
// must define the CODEGENOPT macro to make use of this information.
|
||||
// Optionally, the user may also define ENUM_CODEGENOPT (for options
|
||||
// that have enumeration type and VALUE_CODEGENOPT is a code
|
||||
// generation option that describes a value rather than a flag.
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#ifndef CODEGENOPT
|
||||
# error Define the CODEGENOPT macro to handle language options
|
||||
#endif
|
||||
|
||||
#ifndef VALUE_CODEGENOPT
|
||||
# define VALUE_CODEGENOPT(Name, Bits, Default) \
|
||||
CODEGENOPT(Name, Bits, Default)
|
||||
#endif
|
||||
|
||||
#ifndef ENUM_CODEGENOPT
|
||||
# define ENUM_CODEGENOPT(Name, Type, Bits, Default) \
|
||||
CODEGENOPT(Name, Bits, Default)
|
||||
#endif
|
||||
|
||||
CODEGENOPT(AsmVerbose , 1, 0) ///< -dA, -fverbose-asm.
|
||||
CODEGENOPT(ObjCAutoRefCountExceptions , 1, 0) ///< Whether ARC should be EH-safe.
|
||||
CODEGENOPT(CUDAIsDevice , 1, 0) ///< Set when compiling for CUDA device.
|
||||
CODEGENOPT(CXAAtExit , 1, 1) ///< Use __cxa_atexit for calling destructors.
|
||||
CODEGENOPT(CXXCtorDtorAliases, 1, 0) ///< Emit complete ctors/dtors as linker
|
||||
///< aliases to base ctors when possible.
|
||||
CODEGENOPT(DataSections , 1, 0) ///< Set when -fdata-sections is enabled.
|
||||
CODEGENOPT(DisableFPElim , 1, 0) ///< Set when -fomit-frame-pointer is enabled.
|
||||
CODEGENOPT(DisableLLVMOpts , 1, 0) ///< Don't run any optimizations, for use in
|
||||
///< getting .bc files that correspond to the
|
||||
///< internal state before optimizations are
|
||||
///< done.
|
||||
CODEGENOPT(DisableRedZone , 1, 0) ///< Set when -mno-red-zone is enabled.
|
||||
CODEGENOPT(DisableTailCalls , 1, 0) ///< Do not emit tail calls.
|
||||
CODEGENOPT(EmitDeclMetadata , 1, 0) ///< Emit special metadata indicating what
|
||||
///< Decl* various IR entities came from.
|
||||
///< Only useful when running CodeGen as a
|
||||
///< subroutine.
|
||||
CODEGENOPT(EmitGcovArcs , 1, 0) ///< Emit coverage data files, aka. GCDA.
|
||||
CODEGENOPT(EmitGcovNotes , 1, 0) ///< Emit coverage "notes" files, aka GCNO.
|
||||
CODEGENOPT(EmitOpenCLArgMetadata , 1, 0) ///< Emit OpenCL kernel arg metadata.
|
||||
CODEGENOPT(ForbidGuardVariables , 1, 0) ///< Issue errors if C++ guard variables
|
||||
///< are required.
|
||||
CODEGENOPT(FunctionSections , 1, 0) ///< Set when -ffunction-sections is enabled.
|
||||
CODEGENOPT(HiddenWeakTemplateVTables , 1, 0) ///< Emit weak vtables and RTTI for
|
||||
///< template classes with hidden
|
||||
///< visibility
|
||||
CODEGENOPT(HiddenWeakVTables , 1, 0) ///< Emit weak vtables, RTTI, and thunks with
|
||||
///< hidden visibility.
|
||||
CODEGENOPT(InstrumentFunctions , 1, 0) ///< Set when -finstrument-functions is
|
||||
///< enabled.
|
||||
CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled.
|
||||
CODEGENOPT(LessPreciseFPMAD , 1, 0) ///< Enable less precise MAD instructions to
|
||||
///< be generated.
|
||||
CODEGENOPT(MergeAllConstants , 1, 1) ///< Merge identical constants.
|
||||
CODEGENOPT(NoCommon , 1, 0) ///< Set when -fno-common or C++ is enabled.
|
||||
CODEGENOPT(NoDwarf2CFIAsm , 1, 0) ///< Set when -fno-dwarf2-cfi-asm is enabled.
|
||||
CODEGENOPT(NoDwarfDirectoryAsm , 1, 0) ///< Set when -fno-dwarf-directory-asm is
|
||||
///< enabled.
|
||||
CODEGENOPT(NoExecStack , 1, 0) ///< Set when -Wa,--noexecstack is enabled.
|
||||
CODEGENOPT(NoGlobalMerge , 1, 0) ///< Set when -mno-global-merge is enabled.
|
||||
CODEGENOPT(NoImplicitFloat , 1, 0) ///< Set when -mno-implicit-float is enabled.
|
||||
CODEGENOPT(NoInfsFPMath , 1, 0) ///< Assume FP arguments, results not +-Inf.
|
||||
CODEGENOPT(NoInline , 1, 0) ///< Set when -fno-inline is enabled.
|
||||
///< Disables use of the inline keyword.
|
||||
CODEGENOPT(NoNaNsFPMath , 1, 0) ///< Assume FP arguments, results not NaN.
|
||||
CODEGENOPT(NoZeroInitializedInBSS , 1, 0) ///< -fno-zero-initialized-in-bss.
|
||||
/// \brief Method of Objective-C dispatch to use.
|
||||
ENUM_CODEGENOPT(ObjCDispatchMethod, ObjCDispatchMethodKind, 2, Legacy)
|
||||
CODEGENOPT(OmitLeafFramePointer , 1, 0) ///< Set when -momit-leaf-frame-pointer is
|
||||
///< enabled.
|
||||
VALUE_CODEGENOPT(OptimizationLevel, 3, 0) ///< The -O[0-4] option specified.
|
||||
VALUE_CODEGENOPT(OptimizeSize, 2, 0) ///< If -Os (==1) or -Oz (==2) is specified.
|
||||
CODEGENOPT(RelaxAll , 1, 0) ///< Relax all machine code instructions.
|
||||
CODEGENOPT(RelaxedAliasing , 1, 0) ///< Set when -fno-strict-aliasing is enabled.
|
||||
CODEGENOPT(SaveTempLabels , 1, 0) ///< Save temporary labels.
|
||||
CODEGENOPT(SimplifyLibCalls , 1, 1) ///< Set when -fbuiltin is enabled.
|
||||
CODEGENOPT(SoftFloat , 1, 0) ///< -soft-float.
|
||||
CODEGENOPT(StrictEnums , 1, 0) ///< Optimize based on strict enum definition.
|
||||
CODEGENOPT(TimePasses , 1, 0) ///< Set when -ftime-report is enabled.
|
||||
CODEGENOPT(UnitAtATime , 1, 1) ///< Unused. For mirroring GCC optimization
|
||||
///< selection.
|
||||
CODEGENOPT(UnrollLoops , 1, 0) ///< Control whether loops are unrolled.
|
||||
CODEGENOPT(UnsafeFPMath , 1, 0) ///< Allow unsafe floating point optzns.
|
||||
CODEGENOPT(UnwindTables , 1, 0) ///< Emit unwind tables.
|
||||
|
||||
/// Attempt to use register sized accesses to bit-fields in structures, when
|
||||
/// possible.
|
||||
CODEGENOPT(UseRegisterSizedBitfieldAccess , 1, 0)
|
||||
|
||||
CODEGENOPT(VerifyModule , 1, 1) ///< Control whether the module should be run
|
||||
///< through the LLVM Verifier.
|
||||
|
||||
CODEGENOPT(StackRealignment , 1, 0) ///< Control whether to permit stack
|
||||
///< realignment.
|
||||
CODEGENOPT(UseInitArray , 1, 0) ///< Control whether to use .init_array or
|
||||
///< .ctors.
|
||||
VALUE_CODEGENOPT(StackAlignment , 32, 0) ///< Overrides default stack
|
||||
///< alignment, if not 0.
|
||||
CODEGENOPT(DebugColumnInfo, 1, 0) ///< Whether or not to use column information
|
||||
///< in debug info.
|
||||
|
||||
/// The user specified number of registers to be used for integral arguments,
|
||||
/// or 0 if unspecified.
|
||||
VALUE_CODEGENOPT(NumRegisterParameters, 32, 0)
|
||||
|
||||
/// The run-time penalty for bounds checking, or 0 to disable.
|
||||
VALUE_CODEGENOPT(BoundsChecking, 8, 0)
|
||||
|
||||
/// The lower bound for a buffer to be considered for stack protection.
|
||||
VALUE_CODEGENOPT(SSPBufferSize, 32, 0)
|
||||
|
||||
/// The kind of generated debug info.
|
||||
ENUM_CODEGENOPT(DebugInfo, DebugInfoKind, 2, NoDebugInfo)
|
||||
|
||||
/// The kind of inlining to perform.
|
||||
ENUM_CODEGENOPT(Inlining, InliningMethod, 2, NoInlining)
|
||||
|
||||
/// The default TLS model to use.
|
||||
ENUM_CODEGENOPT(DefaultTLSModel, TLSModel, 2, GeneralDynamicTLSModel)
|
||||
|
||||
#undef CODEGENOPT
|
||||
#undef ENUM_CODEGENOPT
|
||||
#undef VALUE_CODEGENOPT
|
||||
|
||||
@@ -19,9 +19,23 @@
|
||||
|
||||
namespace clang {
|
||||
|
||||
/// \brief Bitfields of CodeGenOptions, split out from CodeGenOptions to ensure
|
||||
/// that this large collection of bitfields is a trivial class type.
|
||||
class CodeGenOptionsBase {
|
||||
public:
|
||||
#define CODEGENOPT(Name, Bits, Default) unsigned Name : Bits;
|
||||
#define ENUM_CODEGENOPT(Name, Type, Bits, Default)
|
||||
#include "clang/Frontend/CodeGenOptions.def"
|
||||
|
||||
protected:
|
||||
#define CODEGENOPT(Name, Bits, Default)
|
||||
#define ENUM_CODEGENOPT(Name, Type, Bits, Default) unsigned Name : Bits;
|
||||
#include "clang/Frontend/CodeGenOptions.def"
|
||||
};
|
||||
|
||||
/// CodeGenOptions - Track various options which control how the code
|
||||
/// is optimized and passed to the backend.
|
||||
class CodeGenOptions {
|
||||
class CodeGenOptions : public CodeGenOptionsBase {
|
||||
public:
|
||||
enum InliningMethod {
|
||||
NoInlining, // Perform no inlining whatsoever.
|
||||
@@ -51,84 +65,6 @@ public:
|
||||
LocalExecTLSModel
|
||||
};
|
||||
|
||||
unsigned AsmVerbose : 1; ///< -dA, -fverbose-asm.
|
||||
unsigned ObjCAutoRefCountExceptions : 1; ///< Whether ARC should be EH-safe.
|
||||
unsigned CUDAIsDevice : 1; ///< Set when compiling for CUDA device.
|
||||
unsigned CXAAtExit : 1; ///< Use __cxa_atexit for calling destructors.
|
||||
unsigned CXXCtorDtorAliases: 1; ///< Emit complete ctors/dtors as linker
|
||||
///< aliases to base ctors when possible.
|
||||
unsigned DataSections : 1; ///< Set when -fdata-sections is enabled.
|
||||
unsigned DisableFPElim : 1; ///< Set when -fomit-frame-pointer is enabled.
|
||||
unsigned DisableLLVMOpts : 1; ///< Don't run any optimizations, for use in
|
||||
///< getting .bc files that correspond to the
|
||||
///< internal state before optimizations are
|
||||
///< done.
|
||||
unsigned DisableRedZone : 1; ///< Set when -mno-red-zone is enabled.
|
||||
unsigned DisableTailCalls : 1; ///< Do not emit tail calls.
|
||||
unsigned EmitDeclMetadata : 1; ///< Emit special metadata indicating what
|
||||
///< Decl* various IR entities came from. Only
|
||||
///< useful when running CodeGen as a
|
||||
///< subroutine.
|
||||
unsigned EmitGcovArcs : 1; ///< Emit coverage data files, aka. GCDA.
|
||||
unsigned EmitGcovNotes : 1; ///< Emit coverage "notes" files, aka GCNO.
|
||||
unsigned EmitOpenCLArgMetadata : 1; ///< Emit OpenCL kernel arg metadata.
|
||||
unsigned ForbidGuardVariables : 1; ///< Issue errors if C++ guard variables
|
||||
///< are required.
|
||||
unsigned FunctionSections : 1; ///< Set when -ffunction-sections is enabled.
|
||||
unsigned HiddenWeakTemplateVTables : 1; ///< Emit weak vtables and RTTI for
|
||||
///< template classes with hidden visibility
|
||||
unsigned HiddenWeakVTables : 1; ///< Emit weak vtables, RTTI, and thunks with
|
||||
///< hidden visibility.
|
||||
unsigned InstrumentFunctions : 1; ///< Set when -finstrument-functions is
|
||||
///< enabled.
|
||||
unsigned InstrumentForProfiling : 1; ///< Set when -pg is enabled.
|
||||
unsigned LessPreciseFPMAD : 1; ///< Enable less precise MAD instructions to
|
||||
///< be generated.
|
||||
unsigned MergeAllConstants : 1; ///< Merge identical constants.
|
||||
unsigned NoCommon : 1; ///< Set when -fno-common or C++ is enabled.
|
||||
unsigned NoDwarf2CFIAsm : 1; ///< Set when -fno-dwarf2-cfi-asm is enabled.
|
||||
unsigned NoDwarfDirectoryAsm : 1; ///< Set when -fno-dwarf-directory-asm is
|
||||
///< enabled.
|
||||
unsigned NoExecStack : 1; ///< Set when -Wa,--noexecstack is enabled.
|
||||
unsigned NoGlobalMerge : 1; ///< Set when -mno-global-merge is enabled.
|
||||
unsigned NoImplicitFloat : 1; ///< Set when -mno-implicit-float is enabled.
|
||||
unsigned NoInfsFPMath : 1; ///< Assume FP arguments, results not +-Inf.
|
||||
unsigned NoInline : 1; ///< Set when -fno-inline is enabled. Disables
|
||||
///< use of the inline keyword.
|
||||
unsigned NoNaNsFPMath : 1; ///< Assume FP arguments, results not NaN.
|
||||
unsigned NoZeroInitializedInBSS : 1; ///< -fno-zero-initialized-in-bss.
|
||||
unsigned ObjCDispatchMethod : 2; ///< Method of Objective-C dispatch to use.
|
||||
unsigned OmitLeafFramePointer : 1; ///< Set when -momit-leaf-frame-pointer is
|
||||
///< enabled.
|
||||
unsigned OptimizationLevel : 3; ///< The -O[0-4] option specified.
|
||||
unsigned OptimizeSize : 2; ///< If -Os (==1) or -Oz (==2) is specified.
|
||||
unsigned RelaxAll : 1; ///< Relax all machine code instructions.
|
||||
unsigned RelaxedAliasing : 1; ///< Set when -fno-strict-aliasing is enabled.
|
||||
unsigned SaveTempLabels : 1; ///< Save temporary labels.
|
||||
unsigned SimplifyLibCalls : 1; ///< Set when -fbuiltin is enabled.
|
||||
unsigned SoftFloat : 1; ///< -soft-float.
|
||||
unsigned StrictEnums : 1; ///< Optimize based on strict enum definition.
|
||||
unsigned TimePasses : 1; ///< Set when -ftime-report is enabled.
|
||||
unsigned UnitAtATime : 1; ///< Unused. For mirroring GCC optimization
|
||||
///< selection.
|
||||
unsigned UnrollLoops : 1; ///< Control whether loops are unrolled.
|
||||
unsigned UnsafeFPMath : 1; ///< Allow unsafe floating point optzns.
|
||||
unsigned UnwindTables : 1; ///< Emit unwind tables.
|
||||
|
||||
/// Attempt to use register sized accesses to bit-fields in structures, when
|
||||
/// possible.
|
||||
unsigned UseRegisterSizedBitfieldAccess : 1;
|
||||
|
||||
unsigned VerifyModule : 1; ///< Control whether the module should be run
|
||||
///< through the LLVM Verifier.
|
||||
|
||||
unsigned StackRealignment : 1; ///< Control whether to permit stack
|
||||
///< realignment.
|
||||
unsigned UseInitArray : 1; ///< Control whether to use .init_array or
|
||||
///< .ctors.
|
||||
unsigned StackAlignment; ///< Overrides default stack alignment,
|
||||
///< if not 0.
|
||||
|
||||
/// The code model to use (-mcmodel).
|
||||
std::string CodeModel;
|
||||
|
||||
@@ -142,12 +78,6 @@ public:
|
||||
/// The string to embed in debug information as the current working directory.
|
||||
std::string DebugCompilationDir;
|
||||
|
||||
/// The kind of generated debug info.
|
||||
DebugInfoKind DebugInfo;
|
||||
|
||||
/// Whether or not to use column information in debug info.
|
||||
bool DebugColumnInfo;
|
||||
|
||||
/// The string to embed in the debug information for the compile unit, if
|
||||
/// non-empty.
|
||||
std::string DwarfDebugFlags;
|
||||
@@ -161,9 +91,6 @@ public:
|
||||
/// The name of the bitcode file to link before optzns.
|
||||
std::string LinkBitcodeFile;
|
||||
|
||||
/// The kind of inlining to perform.
|
||||
InliningMethod Inlining;
|
||||
|
||||
/// The user provided name for the "main file", if non-empty. This is useful
|
||||
/// in situations where the input file name does not match the original input
|
||||
/// file, for example with -save-temps.
|
||||
@@ -179,82 +106,21 @@ public:
|
||||
/// A list of command-line options to forward to the LLVM backend.
|
||||
std::vector<std::string> BackendOptions;
|
||||
|
||||
/// The user specified number of registers to be used for integral arguments,
|
||||
/// or 0 if unspecified.
|
||||
unsigned NumRegisterParameters;
|
||||
|
||||
/// The run-time penalty for bounds checking, or 0 to disable.
|
||||
unsigned char BoundsChecking;
|
||||
|
||||
/// The lower bound for a buffer to be considered for stack protection.
|
||||
unsigned SSPBufferSize;
|
||||
|
||||
/// The default TLS model to use.
|
||||
TLSModel DefaultTLSModel;
|
||||
|
||||
public:
|
||||
// Define accessors/mutators for code generation options of enumeration type.
|
||||
#define CODEGENOPT(Name, Bits, Default)
|
||||
#define ENUM_CODEGENOPT(Name, Type, Bits, Default) \
|
||||
Type get##Name() const { return static_cast<Type>(Name); } \
|
||||
void set##Name(Type Value) { Name = static_cast<unsigned>(Value); }
|
||||
#include "clang/Frontend/CodeGenOptions.def"
|
||||
|
||||
CodeGenOptions() {
|
||||
AsmVerbose = 0;
|
||||
CUDAIsDevice = 0;
|
||||
CXAAtExit = 1;
|
||||
CXXCtorDtorAliases = 0;
|
||||
DataSections = 0;
|
||||
DisableFPElim = 0;
|
||||
DisableLLVMOpts = 0;
|
||||
DisableRedZone = 0;
|
||||
DisableTailCalls = 0;
|
||||
EmitDeclMetadata = 0;
|
||||
EmitGcovArcs = 0;
|
||||
EmitGcovNotes = 0;
|
||||
EmitOpenCLArgMetadata = 0;
|
||||
ForbidGuardVariables = 0;
|
||||
FunctionSections = 0;
|
||||
HiddenWeakTemplateVTables = 0;
|
||||
HiddenWeakVTables = 0;
|
||||
InstrumentFunctions = 0;
|
||||
InstrumentForProfiling = 0;
|
||||
LessPreciseFPMAD = 0;
|
||||
MergeAllConstants = 1;
|
||||
NoCommon = 0;
|
||||
NoDwarf2CFIAsm = 0;
|
||||
NoImplicitFloat = 0;
|
||||
NoInfsFPMath = 0;
|
||||
NoInline = 0;
|
||||
NoNaNsFPMath = 0;
|
||||
NoZeroInitializedInBSS = 0;
|
||||
NumRegisterParameters = 0;
|
||||
ObjCAutoRefCountExceptions = 0;
|
||||
ObjCDispatchMethod = Legacy;
|
||||
OmitLeafFramePointer = 0;
|
||||
OptimizationLevel = 0;
|
||||
OptimizeSize = 0;
|
||||
RelaxAll = 0;
|
||||
RelaxedAliasing = 0;
|
||||
SaveTempLabels = 0;
|
||||
SimplifyLibCalls = 1;
|
||||
SoftFloat = 0;
|
||||
StrictEnums = 0;
|
||||
TimePasses = 0;
|
||||
UnitAtATime = 1;
|
||||
UnrollLoops = 0;
|
||||
UnsafeFPMath = 0;
|
||||
UnwindTables = 0;
|
||||
UseRegisterSizedBitfieldAccess = 0;
|
||||
VerifyModule = 1;
|
||||
StackRealignment = 0;
|
||||
StackAlignment = 0;
|
||||
BoundsChecking = 0;
|
||||
SSPBufferSize = 8;
|
||||
UseInitArray = 0;
|
||||
#define CODEGENOPT(Name, Bits, Default) Name = Default;
|
||||
#define ENUM_CODEGENOPT(Name, Type, Bits, Default) \
|
||||
set##Name(Default);
|
||||
#include "clang/Frontend/CodeGenOptions.def"
|
||||
|
||||
DebugInfo = NoDebugInfo;
|
||||
Inlining = NoInlining;
|
||||
RelocationModel = "pic";
|
||||
DefaultTLSModel = GeneralDynamicTLSModel;
|
||||
}
|
||||
|
||||
ObjCDispatchMethodKind getObjCDispatchMethod() const {
|
||||
return ObjCDispatchMethodKind(ObjCDispatchMethod);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@ static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
|
||||
|
||||
void EmitAssemblyHelper::CreatePasses() {
|
||||
unsigned OptLevel = CodeGenOpts.OptimizationLevel;
|
||||
CodeGenOptions::InliningMethod Inlining = CodeGenOpts.Inlining;
|
||||
CodeGenOptions::InliningMethod Inlining = CodeGenOpts.getInlining();
|
||||
|
||||
// Handle disabling of LLVM optimization, where we want to preserve the
|
||||
// internal module before any optimization.
|
||||
@@ -233,7 +233,7 @@ void EmitAssemblyHelper::CreatePasses() {
|
||||
CodeGenOpts.EmitGcovArcs,
|
||||
TargetTriple.isMacOSX()));
|
||||
|
||||
if (CodeGenOpts.DebugInfo == CodeGenOptions::NoDebugInfo)
|
||||
if (CodeGenOpts.getDebugInfo() == CodeGenOptions::NoDebugInfo)
|
||||
MPM->add(createStripSymbolsPass(true));
|
||||
}
|
||||
|
||||
|
||||
@@ -1134,7 +1134,8 @@ CodeGenFunction::GenerateBlockFunction(GlobalDecl GD,
|
||||
const VarDecl *variable = ci->getVariable();
|
||||
DI->EmitLocation(Builder, variable->getLocation());
|
||||
|
||||
if (CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo()
|
||||
>= CodeGenOptions::LimitedDebugInfo) {
|
||||
const CGBlockInfo::Capture &capture = blockInfo.getCapture(variable);
|
||||
if (capture.isConstant()) {
|
||||
DI->EmitDeclareOfAutoVariable(variable, LocalDeclMap[variable],
|
||||
|
||||
@@ -1238,7 +1238,7 @@ CodeGenFunction::EmitCXXConstructorCall(const CXXConstructorDecl *D,
|
||||
|
||||
CGDebugInfo *DI = getDebugInfo();
|
||||
if (DI &&
|
||||
CGM.getCodeGenOpts().DebugInfo == CodeGenOptions::LimitedDebugInfo) {
|
||||
CGM.getCodeGenOpts().getDebugInfo() == CodeGenOptions::LimitedDebugInfo) {
|
||||
// If debug info for this class has not been emitted then this is the
|
||||
// right time to do so.
|
||||
const CXXRecordDecl *Parent = D->getParent();
|
||||
|
||||
@@ -570,7 +570,7 @@ llvm::DIDescriptor CGDebugInfo::createContextChain(const Decl *Context) {
|
||||
/// then emit record's fwd if debug info size reduction is enabled.
|
||||
llvm::DIType CGDebugInfo::CreatePointeeType(QualType PointeeTy,
|
||||
llvm::DIFile Unit) {
|
||||
if (CGM.getCodeGenOpts().DebugInfo != CodeGenOptions::LimitedDebugInfo)
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() != CodeGenOptions::LimitedDebugInfo)
|
||||
return getOrCreateType(PointeeTy, Unit);
|
||||
|
||||
// Limit debug info for the pointee type.
|
||||
@@ -1210,7 +1210,7 @@ CollectVTableInfo(const CXXRecordDecl *RD, llvm::DIFile Unit,
|
||||
/// getOrCreateRecordType - Emit record type's standalone debug info.
|
||||
llvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy,
|
||||
SourceLocation Loc) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
llvm::DIType T = getOrCreateType(RTy, getOrCreateFile(Loc));
|
||||
return T;
|
||||
}
|
||||
@@ -1219,7 +1219,7 @@ llvm::DIType CGDebugInfo::getOrCreateRecordType(QualType RTy,
|
||||
/// debug info.
|
||||
llvm::DIType CGDebugInfo::getOrCreateInterfaceType(QualType D,
|
||||
SourceLocation Loc) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
llvm::DIType T = getOrCreateType(D, getOrCreateFile(Loc));
|
||||
DBuilder.retainType(T);
|
||||
return T;
|
||||
@@ -1882,7 +1882,7 @@ llvm::DIType CGDebugInfo::CreateLimitedType(const RecordType *Ty) {
|
||||
StringRef RDName = RD->getName();
|
||||
|
||||
llvm::DIDescriptor RDContext;
|
||||
if (CGM.getCodeGenOpts().DebugInfo == CodeGenOptions::LimitedDebugInfo)
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() == CodeGenOptions::LimitedDebugInfo)
|
||||
RDContext = createContextChain(cast<Decl>(RD->getDeclContext()));
|
||||
else
|
||||
RDContext = getContextDescriptor(cast<Decl>(RD->getDeclContext()));
|
||||
@@ -2078,10 +2078,10 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
|
||||
Flags |= llvm::DIDescriptor::FlagPrototyped;
|
||||
}
|
||||
if (LinkageName == Name ||
|
||||
CGM.getCodeGenOpts().DebugInfo <= CodeGenOptions::DebugLineTablesOnly)
|
||||
CGM.getCodeGenOpts().getDebugInfo() <= CodeGenOptions::DebugLineTablesOnly)
|
||||
LinkageName = StringRef();
|
||||
|
||||
if (CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
|
||||
if (const NamespaceDecl *NSDecl =
|
||||
dyn_cast_or_null<NamespaceDecl>(FD->getDeclContext()))
|
||||
FDContext = getOrCreateNameSpace(NSDecl);
|
||||
@@ -2109,7 +2109,7 @@ void CGDebugInfo::EmitFunctionStart(GlobalDecl GD, QualType FnType,
|
||||
|
||||
llvm::DIType DIFnType;
|
||||
llvm::DISubprogram SPDecl;
|
||||
if (CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
|
||||
DIFnType = getOrCreateFunctionType(D, FnType, Unit);
|
||||
SPDecl = getFunctionDeclaration(D);
|
||||
} else {
|
||||
@@ -2285,7 +2285,7 @@ llvm::DIType CGDebugInfo::EmitTypeForVarWithBlocksAttr(const ValueDecl *VD,
|
||||
void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
|
||||
llvm::Value *Storage,
|
||||
unsigned ArgNo, CGBuilderTy &Builder) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
|
||||
|
||||
llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
|
||||
@@ -2427,7 +2427,7 @@ void CGDebugInfo::EmitDeclare(const VarDecl *VD, unsigned Tag,
|
||||
void CGDebugInfo::EmitDeclareOfAutoVariable(const VarDecl *VD,
|
||||
llvm::Value *Storage,
|
||||
CGBuilderTy &Builder) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
EmitDeclare(VD, llvm::dwarf::DW_TAG_auto_variable, Storage, 0, Builder);
|
||||
}
|
||||
|
||||
@@ -2435,7 +2435,7 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD,
|
||||
llvm::Value *Storage,
|
||||
CGBuilderTy &Builder,
|
||||
const CGBlockInfo &blockInfo) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(!LexicalBlockStack.empty() && "Region stack mismatch, stack empty!");
|
||||
|
||||
if (Builder.GetInsertBlock() == 0)
|
||||
@@ -2501,7 +2501,7 @@ void CGDebugInfo::EmitDeclareOfBlockDeclRefVariable(const VarDecl *VD,
|
||||
void CGDebugInfo::EmitDeclareOfArgVariable(const VarDecl *VD, llvm::Value *AI,
|
||||
unsigned ArgNo,
|
||||
CGBuilderTy &Builder) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
EmitDeclare(VD, llvm::dwarf::DW_TAG_arg_variable, AI, ArgNo, Builder);
|
||||
}
|
||||
|
||||
@@ -2518,7 +2518,7 @@ namespace {
|
||||
void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
|
||||
llvm::Value *addr,
|
||||
CGBuilderTy &Builder) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
ASTContext &C = CGM.getContext();
|
||||
const BlockDecl *blockDecl = block.getBlockDecl();
|
||||
|
||||
@@ -2663,7 +2663,7 @@ void CGDebugInfo::EmitDeclareOfBlockLiteralArgVariable(const CGBlockInfo &block,
|
||||
/// EmitGlobalVariable - Emit information about a global variable.
|
||||
void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
|
||||
const VarDecl *D) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
// Create global variable debug descriptor.
|
||||
llvm::DIFile Unit = getOrCreateFile(D->getLocation());
|
||||
unsigned LineNo = getLineNumber(D->getLocation());
|
||||
@@ -2697,7 +2697,7 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
|
||||
/// EmitGlobalVariable - Emit information about an objective-c interface.
|
||||
void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
|
||||
ObjCInterfaceDecl *ID) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
// Create global variable debug descriptor.
|
||||
llvm::DIFile Unit = getOrCreateFile(ID->getLocation());
|
||||
unsigned LineNo = getLineNumber(ID->getLocation());
|
||||
@@ -2723,7 +2723,7 @@ void CGDebugInfo::EmitGlobalVariable(llvm::GlobalVariable *Var,
|
||||
/// EmitGlobalVariable - Emit global variable's debug info.
|
||||
void CGDebugInfo::EmitGlobalVariable(const ValueDecl *VD,
|
||||
llvm::Constant *Init) {
|
||||
assert(CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo);
|
||||
assert(CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo);
|
||||
// Create the descriptor for the variable.
|
||||
llvm::DIFile Unit = getOrCreateFile(VD->getLocation());
|
||||
StringRef Name = VD->getName();
|
||||
|
||||
@@ -333,7 +333,7 @@ void CodeGenFunction::EmitStaticVarDecl(const VarDecl &D,
|
||||
// Emit global variable debug descriptor for static vars.
|
||||
CGDebugInfo *DI = getDebugInfo();
|
||||
if (DI &&
|
||||
CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo) {
|
||||
CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo) {
|
||||
DI->setLocation(D.getLocation());
|
||||
DI->EmitGlobalVariable(var, &D);
|
||||
}
|
||||
@@ -914,7 +914,8 @@ CodeGenFunction::EmitAutoVarAlloca(const VarDecl &D) {
|
||||
// Emit debug info for local var declaration.
|
||||
if (HaveInsertPoint())
|
||||
if (CGDebugInfo *DI = getDebugInfo()) {
|
||||
if (CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo()
|
||||
>= CodeGenOptions::LimitedDebugInfo) {
|
||||
DI->setLocation(D.getLocation());
|
||||
if (Target.useGlobalsForAutomaticVariables()) {
|
||||
DI->EmitGlobalVariable(static_cast<llvm::GlobalVariable *>(DeclPtr),
|
||||
@@ -1498,8 +1499,8 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
|
||||
LocalDeclMap[&D] = Arg;
|
||||
|
||||
if (CGDebugInfo *DI = getDebugInfo()) {
|
||||
if (CGM.getCodeGenOpts().DebugInfo >=
|
||||
CodeGenOptions::LimitedDebugInfo) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo()
|
||||
>= CodeGenOptions::LimitedDebugInfo) {
|
||||
DI->setLocation(D.getLocation());
|
||||
DI->EmitDeclareOfBlockLiteralArgVariable(*BlockInfo, Arg, Builder);
|
||||
}
|
||||
@@ -1581,7 +1582,8 @@ void CodeGenFunction::EmitParmDecl(const VarDecl &D, llvm::Value *Arg,
|
||||
|
||||
// Emit debug info for param declaration.
|
||||
if (CGDebugInfo *DI = getDebugInfo()) {
|
||||
if (CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo) {
|
||||
if (CGM.getCodeGenOpts().getDebugInfo()
|
||||
>= CodeGenOptions::LimitedDebugInfo) {
|
||||
DI->EmitDeclareOfArgVariable(&D, DeclPtr, ArgNo, Builder);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -175,8 +175,9 @@ RValue CodeGenFunction::EmitCXXMemberCallExpr(const CXXMemberCallExpr *CE,
|
||||
const CXXMethodDecl *MD = cast<CXXMethodDecl>(ME->getMemberDecl());
|
||||
|
||||
CGDebugInfo *DI = getDebugInfo();
|
||||
if (DI && CGM.getCodeGenOpts().DebugInfo == CodeGenOptions::LimitedDebugInfo
|
||||
&& !isa<CallExpr>(ME->getBase())) {
|
||||
if (DI &&
|
||||
CGM.getCodeGenOpts().getDebugInfo() == CodeGenOptions::LimitedDebugInfo &&
|
||||
!isa<CallExpr>(ME->getBase())) {
|
||||
QualType PQTy = ME->getBase()->IgnoreParenImpCasts()->getType();
|
||||
if (const PointerType * PTy = dyn_cast<PointerType>(PQTy)) {
|
||||
DI->getOrCreateRecordType(PTy->getPointeeType(),
|
||||
|
||||
@@ -969,7 +969,8 @@ Value *ScalarExprEmitter::VisitMemberExpr(MemberExpr *E) {
|
||||
// debug info size.
|
||||
CGDebugInfo *DI = CGF.getDebugInfo();
|
||||
if (DI &&
|
||||
CGF.CGM.getCodeGenOpts().DebugInfo == CodeGenOptions::LimitedDebugInfo) {
|
||||
CGF.CGM.getCodeGenOpts().getDebugInfo()
|
||||
== CodeGenOptions::LimitedDebugInfo) {
|
||||
QualType PQTy = E->getBase()->IgnoreParenImpCasts()->getType();
|
||||
if (const PointerType * PTy = dyn_cast<PointerType>(PQTy))
|
||||
if (FieldDecl *M = dyn_cast<FieldDecl>(E->getMemberDecl()))
|
||||
|
||||
@@ -1190,7 +1190,7 @@ void CodeGenFunction::EmitDeclRefExprDbgValue(const DeclRefExpr *E,
|
||||
llvm::Constant *Init) {
|
||||
assert (Init && "Invalid DeclRefExpr initializer!");
|
||||
if (CGDebugInfo *Dbg = getDebugInfo())
|
||||
if (CGM.getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo)
|
||||
if (CGM.getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
|
||||
Dbg->EmitGlobalVariable(E->getDecl(), Init);
|
||||
}
|
||||
|
||||
|
||||
@@ -110,7 +110,7 @@ CodeGenModule::CodeGenModule(ASTContext &C, const CodeGenOptions &CGO,
|
||||
|
||||
// If debug info or coverage generation is enabled, create the CGDebugInfo
|
||||
// object.
|
||||
if (CodeGenOpts.DebugInfo != CodeGenOptions::NoDebugInfo ||
|
||||
if (CodeGenOpts.getDebugInfo() != CodeGenOptions::NoDebugInfo ||
|
||||
CodeGenOpts.EmitGcovArcs ||
|
||||
CodeGenOpts.EmitGcovNotes)
|
||||
DebugInfo = new CGDebugInfo(*this);
|
||||
@@ -293,7 +293,7 @@ void CodeGenModule::setTLSMode(llvm::GlobalVariable *GV,
|
||||
assert(D.isThreadSpecified() && "setting TLS mode on non-TLS var!");
|
||||
|
||||
llvm::GlobalVariable::ThreadLocalMode TLM;
|
||||
TLM = GetLLVMTLSModel(CodeGenOpts.DefaultTLSModel);
|
||||
TLM = GetLLVMTLSModel(CodeGenOpts.getDefaultTLSModel());
|
||||
|
||||
// Override the TLS model if it is explicitly specified.
|
||||
if (D.hasAttr<TLSModelAttr>()) {
|
||||
@@ -1750,7 +1750,7 @@ void CodeGenModule::EmitGlobalVarDefinition(const VarDecl *D) {
|
||||
|
||||
// Emit global variable debug information.
|
||||
if (CGDebugInfo *DI = getModuleDebugInfo())
|
||||
if (getCodeGenOpts().DebugInfo >= CodeGenOptions::LimitedDebugInfo)
|
||||
if (getCodeGenOpts().getDebugInfo() >= CodeGenOptions::LimitedDebugInfo)
|
||||
DI->EmitGlobalVariable(GV, D);
|
||||
}
|
||||
|
||||
|
||||
@@ -182,7 +182,7 @@ static void AnalyzerOptsToArgs(const AnalyzerOptions &Opts, ToArgsList &Res) {
|
||||
}
|
||||
|
||||
static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {
|
||||
switch (Opts.DebugInfo) {
|
||||
switch (Opts.getDebugInfo()) {
|
||||
case CodeGenOptions::NoDebugInfo:
|
||||
break;
|
||||
case CodeGenOptions::DebugLineTablesOnly:
|
||||
@@ -313,7 +313,7 @@ static void CodeGenOptsToArgs(const CodeGenOptions &Opts, ToArgsList &Res) {
|
||||
for (unsigned i = 0, e = Opts.BackendOptions.size(); i != e; ++i)
|
||||
Res.push_back("-backend-option", Opts.BackendOptions[i]);
|
||||
|
||||
switch (Opts.DefaultTLSModel) {
|
||||
switch (Opts.getDefaultTLSModel()) {
|
||||
case CodeGenOptions::GeneralDynamicTLSModel:
|
||||
break;
|
||||
case CodeGenOptions::LocalDynamicTLSModel:
|
||||
@@ -1215,20 +1215,21 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Opts.OptimizationLevel = OptLevel;
|
||||
|
||||
// We must always run at least the always inlining pass.
|
||||
Opts.Inlining = (Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining
|
||||
: CodeGenOptions::OnlyAlwaysInlining;
|
||||
Opts.setInlining(
|
||||
(Opts.OptimizationLevel > 1) ? CodeGenOptions::NormalInlining
|
||||
: CodeGenOptions::OnlyAlwaysInlining);
|
||||
// -fno-inline-functions overrides OptimizationLevel > 1.
|
||||
Opts.NoInline = Args.hasArg(OPT_fno_inline);
|
||||
Opts.Inlining = Args.hasArg(OPT_fno_inline_functions) ?
|
||||
CodeGenOptions::OnlyAlwaysInlining : Opts.Inlining;
|
||||
Opts.setInlining(Args.hasArg(OPT_fno_inline_functions) ?
|
||||
CodeGenOptions::OnlyAlwaysInlining : Opts.getInlining());
|
||||
|
||||
if (Args.hasArg(OPT_gline_tables_only)) {
|
||||
Opts.DebugInfo = CodeGenOptions::DebugLineTablesOnly;
|
||||
Opts.setDebugInfo(CodeGenOptions::DebugLineTablesOnly);
|
||||
} else if (Args.hasArg(OPT_g_Flag)) {
|
||||
if (Args.hasFlag(OPT_flimit_debug_info, OPT_fno_limit_debug_info, true))
|
||||
Opts.DebugInfo = CodeGenOptions::LimitedDebugInfo;
|
||||
Opts.setDebugInfo(CodeGenOptions::LimitedDebugInfo);
|
||||
else
|
||||
Opts.DebugInfo = CodeGenOptions::FullDebugInfo;
|
||||
Opts.setDebugInfo(CodeGenOptions::FullDebugInfo);
|
||||
}
|
||||
Opts.DebugColumnInfo = Args.hasArg(OPT_dwarf_column_info);
|
||||
|
||||
@@ -1308,7 +1309,9 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Opts.StackRealignment = Args.hasArg(OPT_mstackrealign);
|
||||
if (Arg *A = Args.getLastArg(OPT_mstack_alignment)) {
|
||||
StringRef Val = A->getValue(Args);
|
||||
Val.getAsInteger(10, Opts.StackAlignment);
|
||||
unsigned StackAlignment = Opts.StackAlignment;
|
||||
Val.getAsInteger(10, StackAlignment);
|
||||
Opts.StackAlignment = StackAlignment;
|
||||
}
|
||||
|
||||
if (Arg *A = Args.getLastArg(OPT_fobjc_dispatch_method_EQ)) {
|
||||
@@ -1322,7 +1325,8 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.ObjCDispatchMethod = Method;
|
||||
Opts.setObjCDispatchMethod(
|
||||
static_cast<CodeGenOptions::ObjCDispatchMethodKind>(Method));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1338,7 +1342,7 @@ static bool ParseCodeGenArgs(CodeGenOptions &Opts, ArgList &Args, InputKind IK,
|
||||
Diags.Report(diag::err_drv_invalid_value) << A->getAsString(Args) << Name;
|
||||
Success = false;
|
||||
} else {
|
||||
Opts.DefaultTLSModel = static_cast<CodeGenOptions::TLSModel>(Model);
|
||||
Opts.setDefaultTLSModel(static_cast<CodeGenOptions::TLSModel>(Model));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user