Index: clang/include/clang/Basic/CodeGenOptions.def =================================================================== --- clang/include/clang/Basic/CodeGenOptions.def +++ clang/include/clang/Basic/CodeGenOptions.def @@ -325,6 +325,9 @@ /// emitted. VALUE_CODEGENOPT(DwarfVersion, 3, 0) +/// Whether to use experimental new variable location tracking. +CODEGENOPT(ValueTrackingVariableLocations, 1, 0) + /// Whether we should emit CodeView debug information. It's possible to emit /// CodeView and DWARF into the same object. CODEGENOPT(EmitCodeView, 1, 0) Index: clang/include/clang/Driver/CC1Options.td =================================================================== --- clang/include/clang/Driver/CC1Options.td +++ clang/include/clang/Driver/CC1Options.td @@ -389,6 +389,9 @@ HelpText<"Prints debug information for the new pass manager">; def fno_debug_pass_manager : Flag<["-"], "fno-debug-pass-manager">, HelpText<"Disables debug printing for the new pass manager">; +def fexperimental_debug_variable_locations : Flag<["-"], + "fexperimental-debug-variable-locations">, + HelpText<"Use experimental new value-tracking variable locations">; // The driver option takes the key as a parameter to the -msign-return-address= // and -mbranch-protection= options, but CC1 has a separate option so we // don't have to parse the parameter twice. Index: clang/lib/CodeGen/BackendUtil.cpp =================================================================== --- clang/lib/CodeGen/BackendUtil.cpp +++ clang/lib/CodeGen/BackendUtil.cpp @@ -516,6 +516,8 @@ Options.EmitAddrsig = CodeGenOpts.Addrsig; Options.ForceDwarfFrameSection = CodeGenOpts.ForceDwarfFrameSection; Options.EmitCallSiteInfo = CodeGenOpts.EmitCallSiteInfo; + Options.ValueTrackingVariableLocations = + CodeGenOpts.ValueTrackingVariableLocations; Options.XRayOmitFunctionIndex = CodeGenOpts.XRayOmitFunctionIndex; Options.MCOptions.SplitDwarfFile = CodeGenOpts.SplitDwarfFile; Index: clang/lib/Frontend/CompilerInvocation.cpp =================================================================== --- clang/lib/Frontend/CompilerInvocation.cpp +++ clang/lib/Frontend/CompilerInvocation.cpp @@ -791,6 +791,9 @@ llvm::is_contained(DebugEntryValueArchs, T.getArch())) Opts.EmitCallSiteInfo = true; + Opts.ValueTrackingVariableLocations = + Args.hasArg(OPT_fexperimental_debug_variable_locations); + Opts.DisableO0ImplyOptNone = Args.hasArg(OPT_disable_O0_optnone); Opts.DisableRedZone = Args.hasArg(OPT_disable_red_zone); Opts.IndirectTlsSegRefs = Args.hasArg(OPT_mno_tls_direct_seg_refs); Index: llvm/include/llvm/CodeGen/CommandFlags.h =================================================================== --- llvm/include/llvm/CodeGen/CommandFlags.h +++ llvm/include/llvm/CodeGen/CommandFlags.h @@ -116,6 +116,8 @@ bool getEnableDebugEntryValues(); +bool getValueTrackingVariableLocations(); + bool getForceDwarfFrameSection(); bool getXRayOmitFunctionIndex(); Index: llvm/include/llvm/Target/TargetOptions.h =================================================================== --- llvm/include/llvm/Target/TargetOptions.h +++ llvm/include/llvm/Target/TargetOptions.h @@ -127,8 +127,8 @@ EmitStackSizeSection(false), EnableMachineOutliner(false), SupportsDefaultOutlining(false), EmitAddrsig(false), EmitCallSiteInfo(false), SupportsDebugEntryValues(false), - EnableDebugEntryValues(false), ForceDwarfFrameSection(false), - XRayOmitFunctionIndex(false), + EnableDebugEntryValues(false), ValueTrackingVariableLocations(false), + ForceDwarfFrameSection(false), XRayOmitFunctionIndex(false), FPDenormalMode(DenormalMode::IEEE, DenormalMode::IEEE) {} /// PrintMachineCode - This flag is enabled when the -print-machineinstrs @@ -291,6 +291,11 @@ /// production. bool ShouldEmitDebugEntryValues() const; + // When set to true, use experimental new debug variable location tracking, + // which seeks to follow the values of variables rather than their location, + // post isel. + unsigned ValueTrackingVariableLocations : 1; + /// Emit DWARF debug frame section. unsigned ForceDwarfFrameSection : 1; Index: llvm/lib/CodeGen/CommandFlags.cpp =================================================================== --- llvm/lib/CodeGen/CommandFlags.cpp +++ llvm/lib/CodeGen/CommandFlags.cpp @@ -85,6 +85,7 @@ CGOPT(bool, EnableAddrsig) CGOPT(bool, EmitCallSiteInfo) CGOPT(bool, EnableDebugEntryValues) +CGOPT(bool, ValueTrackingVariableLocations) CGOPT(bool, ForceDwarfFrameSection) CGOPT(bool, XRayOmitFunctionIndex) @@ -400,6 +401,12 @@ cl::init(false)); CGBINDOPT(EnableDebugEntryValues); + static cl::opt ValueTrackingVariableLocations( + "experimental-debug-variable-locations", + cl::desc("Use experimental new value-tracking variable locations"), + cl::init(false)); + CGBINDOPT(ValueTrackingVariableLocations); + static cl::opt ForceDwarfFrameSection( "force-dwarf-frame-section", cl::desc("Always emit a debug frame section."), cl::init(false)); @@ -475,6 +482,7 @@ Options.EmitAddrsig = getEnableAddrsig(); Options.EmitCallSiteInfo = getEmitCallSiteInfo(); Options.EnableDebugEntryValues = getEnableDebugEntryValues(); + Options.ValueTrackingVariableLocations = getValueTrackingVariableLocations(); Options.ForceDwarfFrameSection = getForceDwarfFrameSection(); Options.XRayOmitFunctionIndex = getXRayOmitFunctionIndex(); Index: llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp =================================================================== --- llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp +++ llvm/lib/CodeGen/LiveDebugValues/LiveDebugValues.cpp @@ -13,6 +13,7 @@ #include "llvm/CodeGen/MachineFunction.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/Passes.h" +#include "llvm/Target/TargetMachine.h" #include "llvm/InitializePasses.h" #include "llvm/Pass.h" @@ -41,7 +42,11 @@ static char ID; LiveDebugValues(); - ~LiveDebugValues() { delete TheImpl; } + ~LiveDebugValues() + { + if (TheImpl) + delete TheImpl; + } /// Calculate the liveness information for the given machine function. bool runOnMachineFunction(MachineFunction &MF) override; @@ -58,6 +63,7 @@ private: LDVImpl *TheImpl; + TargetPassConfig *TPC; }; char LiveDebugValues::ID = 0; @@ -70,10 +76,24 @@ /// Default construct and initialize the pass. LiveDebugValues::LiveDebugValues() : MachineFunctionPass(ID) { initializeLiveDebugValuesPass(*PassRegistry::getPassRegistry()); - TheImpl = llvm::makeVarLocBasedLiveDebugValues(); + TheImpl = nullptr; } bool LiveDebugValues::runOnMachineFunction(MachineFunction &MF) { - auto *TPC = getAnalysisIfAvailable(); + if (!TheImpl) { + TPC = getAnalysisIfAvailable(); + + bool InstrRefBased = false; + if (TPC) { + auto &TM = TPC->getTM(); + InstrRefBased = TM.Options.ValueTrackingVariableLocations; + } + + if (InstrRefBased) + TheImpl = llvm::makeInstrRefBasedLiveDebugValues(); + else + TheImpl = llvm::makeVarLocBasedLiveDebugValues(); + } + return TheImpl->ExtendRanges(MF, TPC); }