
(This is a re-do of #138972, which had a minor warning in `Clang.cpp`.) This PR adds some of the support needed for Windows hot-patching. Windows implements a form of hot-patching. This allows patches to be applied to Windows apps, drivers, and the kernel, without rebooting or restarting any of these components. Hot-patching is a complex technology and requires coordination between the OS, compilers, linkers, and additional tools. This PR adds support to Clang and LLVM for part of the hot-patching process. It enables LLVM to generate the required code changes and to generate CodeView symbols which identify hot-patched functions. The PR provides new command-line arguments to Clang which allow developers to identify the list of functions that need to be hot-patched. This PR also allows LLVM to directly receive the list of functions to be modified, so that language front-ends which have not yet been modified (such as Rust) can still make use of hot-patching. This PR: * Adds a `MarkedForWindowsHotPatching` LLVM function attribute. This attribute indicates that a function should be _hot-patched_. This generates a new CodeView symbol, `S_HOTPATCHFUNC`, which identifies any function that has been hot-patched. This attribute also causes accesses to global variables to be indirected through a `_ref_*` global variable. This allows hot-patched functions to access the correct version of a global variable; the hot-patched code needs to access the variable in the _original_ image, not the patch image. * Adds a `AllowDirectAccessInHotPatchFunction` LLVM attribute. This attribute may be placed on global variable declarations. It indicates that the variable may be safely accessed without the `_ref_*` indirection. * Adds two Clang command-line parameters: `-fms-hotpatch-functions-file` and `-fms-hotpatch-functions-list`. The `-file` flag may point to a text file, which contains a list of functions to be hot-patched (one function name per line). The `-list` flag simply directly identifies functions to be patched, using a comma-separated list. These two command-line parameters may also be combined; the final set of functions to be hot-patched is the union of the two sets. * Adds similar LLVM command-line parameters: `--ms-hotpatch-functions-file` and `--ms-hotpatch-functions-list`. * Adds integration tests for both LLVM and Clang. * Adds support for dumping the new `S_HOTPATCHFUNC` CodeView symbol. Although the flags are redundant between Clang and LLVM, this allows additional languages (such as Rust) to take advantage of hot-patching support before they have been modified to generate the required attributes. Credit to @dpaoliello, who wrote the original form of this patch.
294 lines
6.8 KiB
CMake
294 lines
6.8 KiB
CMake
if (DEFINED LLVM_HAVE_TF_AOT OR LLVM_HAVE_TFLITE)
|
|
include(TensorFlowCompile)
|
|
set(LLVM_RAEVICT_MODEL_PATH_DEFAULT "models/regalloc-eviction")
|
|
|
|
set(LLVM_RAEVICT_MODEL_CURRENT_URL "<UNSPECIFIED>" CACHE STRING "URL to download the LLVM register allocator eviction model")
|
|
|
|
if (DEFINED LLVM_HAVE_TF_AOT)
|
|
tf_find_and_compile(
|
|
${LLVM_RAEVICT_MODEL_PATH}
|
|
${LLVM_RAEVICT_MODEL_CURRENT_URL}
|
|
${LLVM_RAEVICT_MODEL_PATH_DEFAULT}
|
|
"../Analysis/models/gen-regalloc-eviction-test-model.py"
|
|
serve
|
|
action
|
|
RegAllocEvictModel
|
|
llvm::RegAllocEvictModel
|
|
)
|
|
endif()
|
|
|
|
if (LLVM_HAVE_TFLITE)
|
|
list(APPEND MLLinkDeps ${tensorflow_c_api} ${tensorflow_fx})
|
|
endif()
|
|
endif()
|
|
|
|
add_llvm_component_library(LLVMCodeGen
|
|
AggressiveAntiDepBreaker.cpp
|
|
AllocationOrder.cpp
|
|
Analysis.cpp
|
|
AssignmentTrackingAnalysis.cpp
|
|
AtomicExpandPass.cpp
|
|
BasicTargetTransformInfo.cpp
|
|
BranchFolding.cpp
|
|
BranchRelaxation.cpp
|
|
BreakFalseDeps.cpp
|
|
BasicBlockSections.cpp
|
|
BasicBlockPathCloning.cpp
|
|
BasicBlockSectionsProfileReader.cpp
|
|
CalcSpillWeights.cpp
|
|
CallBrPrepare.cpp
|
|
CallingConvLower.cpp
|
|
CFGuardLongjmp.cpp
|
|
CFIFixup.cpp
|
|
CFIInstrInserter.cpp
|
|
CodeGen.cpp
|
|
CodeGenCommonISel.cpp
|
|
CodeGenPrepare.cpp
|
|
CommandFlags.cpp
|
|
ComplexDeinterleavingPass.cpp
|
|
CriticalAntiDepBreaker.cpp
|
|
DeadMachineInstructionElim.cpp
|
|
DetectDeadLanes.cpp
|
|
DFAPacketizer.cpp
|
|
DroppedVariableStatsMIR.cpp
|
|
DwarfEHPrepare.cpp
|
|
EarlyIfConversion.cpp
|
|
EdgeBundles.cpp
|
|
EHContGuardTargets.cpp
|
|
ExecutionDomainFix.cpp
|
|
ExpandLargeDivRem.cpp
|
|
ExpandFp.cpp
|
|
ExpandMemCmp.cpp
|
|
ExpandPostRAPseudos.cpp
|
|
ExpandReductions.cpp
|
|
ExpandVectorPredication.cpp
|
|
FaultMaps.cpp
|
|
FEntryInserter.cpp
|
|
FinalizeISel.cpp
|
|
FixupStatepointCallerSaved.cpp
|
|
FuncletLayout.cpp
|
|
MachineFunctionAnalysis.cpp
|
|
GCMetadata.cpp
|
|
GCMetadataPrinter.cpp
|
|
GCRootLowering.cpp
|
|
GlobalMerge.cpp
|
|
GlobalMergeFunctions.cpp
|
|
HardwareLoops.cpp
|
|
IfConversion.cpp
|
|
ImplicitNullChecks.cpp
|
|
IndirectBrExpandPass.cpp
|
|
InitUndef.cpp
|
|
InlineSpiller.cpp
|
|
InterferenceCache.cpp
|
|
InterleavedAccessPass.cpp
|
|
InterleavedLoadCombinePass.cpp
|
|
IntrinsicLowering.cpp
|
|
JMCInstrumenter.cpp
|
|
KCFI.cpp
|
|
LatencyPriorityQueue.cpp
|
|
LazyMachineBlockFrequencyInfo.cpp
|
|
LexicalScopes.cpp
|
|
LiveDebugVariables.cpp
|
|
LiveIntervals.cpp
|
|
LiveInterval.cpp
|
|
LiveIntervalUnion.cpp
|
|
LivePhysRegs.cpp
|
|
LiveRangeCalc.cpp
|
|
LiveIntervalCalc.cpp
|
|
LiveRangeEdit.cpp
|
|
LiveRangeShrink.cpp
|
|
LiveRegMatrix.cpp
|
|
LiveRegUnits.cpp
|
|
LiveStacks.cpp
|
|
LiveVariables.cpp
|
|
CodeGenTargetMachineImpl.cpp
|
|
LocalStackSlotAllocation.cpp
|
|
LoopTraversal.cpp
|
|
LowLevelTypeUtils.cpp
|
|
LowerEmuTLS.cpp
|
|
MachineBasicBlock.cpp
|
|
MachineBlockFrequencyInfo.cpp
|
|
MachineBlockPlacement.cpp
|
|
MachineBranchProbabilityInfo.cpp
|
|
MachineCFGPrinter.cpp
|
|
MachineCombiner.cpp
|
|
MachineConvergenceVerifier.cpp
|
|
MachineCopyPropagation.cpp
|
|
MachineCSE.cpp
|
|
MachineCheckDebugify.cpp
|
|
MachineCycleAnalysis.cpp
|
|
MachineDebugify.cpp
|
|
MachineDomTreeUpdater.cpp
|
|
MachineDominanceFrontier.cpp
|
|
MachineDominators.cpp
|
|
MachineFrameInfo.cpp
|
|
MachineFunction.cpp
|
|
MachineFunctionPass.cpp
|
|
MachineFunctionPrinterPass.cpp
|
|
MachineFunctionSplitter.cpp
|
|
MachineInstrBundle.cpp
|
|
MachineInstr.cpp
|
|
MachineLateInstrsCleanup.cpp
|
|
MachineLICM.cpp
|
|
MachineLoopInfo.cpp
|
|
MachineLoopUtils.cpp
|
|
MachineModuleInfo.cpp
|
|
MachineModuleInfoImpls.cpp
|
|
MachineModuleSlotTracker.cpp
|
|
MachineOperand.cpp
|
|
MachineOptimizationRemarkEmitter.cpp
|
|
MachineOutliner.cpp
|
|
MachinePassManager.cpp
|
|
MachinePipeliner.cpp
|
|
MachinePostDominators.cpp
|
|
MachineRegionInfo.cpp
|
|
MachineRegisterInfo.cpp
|
|
MachineScheduler.cpp
|
|
MachineSink.cpp
|
|
MachineSizeOpts.cpp
|
|
MachineSSAContext.cpp
|
|
MachineSSAUpdater.cpp
|
|
MachineStripDebug.cpp
|
|
MachineTraceMetrics.cpp
|
|
MachineUniformityAnalysis.cpp
|
|
MachineVerifier.cpp
|
|
MIRFSDiscriminator.cpp
|
|
MIRSampleProfile.cpp
|
|
MIRYamlMapping.cpp
|
|
MLRegAllocEvictAdvisor.cpp
|
|
MLRegAllocPriorityAdvisor.cpp
|
|
ModuloSchedule.cpp
|
|
MultiHazardRecognizer.cpp
|
|
PatchableFunction.cpp
|
|
MBFIWrapper.cpp
|
|
MIRPrinter.cpp
|
|
MIRPrintingPass.cpp
|
|
MacroFusion.cpp
|
|
NonRelocatableStringpool.cpp
|
|
OptimizePHIs.cpp
|
|
PeepholeOptimizer.cpp
|
|
PHIElimination.cpp
|
|
PHIEliminationUtils.cpp
|
|
PostRAHazardRecognizer.cpp
|
|
PostRASchedulerList.cpp
|
|
PreISelIntrinsicLowering.cpp
|
|
ProcessImplicitDefs.cpp
|
|
PrologEpilogInserter.cpp
|
|
PseudoProbeInserter.cpp
|
|
PseudoSourceValue.cpp
|
|
RDFGraph.cpp
|
|
RDFLiveness.cpp
|
|
RDFRegisters.cpp
|
|
ReachingDefAnalysis.cpp
|
|
RegAllocBase.cpp
|
|
RegAllocBasic.cpp
|
|
RegAllocEvictionAdvisor.cpp
|
|
RegAllocFast.cpp
|
|
RegAllocGreedy.cpp
|
|
RegAllocPBQP.cpp
|
|
RegAllocPriorityAdvisor.cpp
|
|
RegAllocScore.cpp
|
|
RegisterClassInfo.cpp
|
|
RegisterCoalescer.cpp
|
|
RegisterPressure.cpp
|
|
RegisterScavenging.cpp
|
|
GCEmptyBasicBlocks.cpp
|
|
RemoveRedundantDebugValues.cpp
|
|
RenameIndependentSubregs.cpp
|
|
MachineStableHash.cpp
|
|
MIRVRegNamerUtils.cpp
|
|
MIRNamerPass.cpp
|
|
MIRCanonicalizerPass.cpp
|
|
RegisterUsageInfo.cpp
|
|
RegUsageInfoCollector.cpp
|
|
RegUsageInfoPropagate.cpp
|
|
RemoveLoadsIntoFakeUses.cpp
|
|
ReplaceWithVeclib.cpp
|
|
ResetMachineFunctionPass.cpp
|
|
RegisterBank.cpp
|
|
RegisterBankInfo.cpp
|
|
SafeStack.cpp
|
|
SafeStackLayout.cpp
|
|
SanitizerBinaryMetadata.cpp
|
|
ScheduleDAG.cpp
|
|
ScheduleDAGInstrs.cpp
|
|
ScheduleDAGPrinter.cpp
|
|
ScoreboardHazardRecognizer.cpp
|
|
SelectOptimize.cpp
|
|
ShadowStackGCLowering.cpp
|
|
ShrinkWrap.cpp
|
|
SjLjEHPrepare.cpp
|
|
SlotIndexes.cpp
|
|
SpillPlacement.cpp
|
|
SplitKit.cpp
|
|
StackColoring.cpp
|
|
StackFrameLayoutAnalysisPass.cpp
|
|
StackMapLivenessAnalysis.cpp
|
|
StackMaps.cpp
|
|
StackProtector.cpp
|
|
StackSlotColoring.cpp
|
|
StaticDataSplitter.cpp
|
|
StaticDataAnnotator.cpp
|
|
SwiftErrorValueTracking.cpp
|
|
SwitchLoweringUtils.cpp
|
|
TailDuplication.cpp
|
|
TailDuplicator.cpp
|
|
TargetFrameLoweringImpl.cpp
|
|
TargetInstrInfo.cpp
|
|
TargetLoweringBase.cpp
|
|
TargetLoweringObjectFileImpl.cpp
|
|
TargetOptionsImpl.cpp
|
|
TargetPassConfig.cpp
|
|
TargetRegisterInfo.cpp
|
|
TargetSchedule.cpp
|
|
TargetSubtargetInfo.cpp
|
|
TwoAddressInstructionPass.cpp
|
|
TypePromotion.cpp
|
|
UnreachableBlockElim.cpp
|
|
ValueTypes.cpp
|
|
VLIWMachineScheduler.cpp
|
|
VirtRegMap.cpp
|
|
WasmEHPrepare.cpp
|
|
WindowScheduler.cpp
|
|
WindowsSecureHotPatching.cpp
|
|
WinEHPrepare.cpp
|
|
XRayInstrumentation.cpp
|
|
${GeneratedMLSources}
|
|
|
|
LiveDebugValues/LiveDebugValues.cpp
|
|
LiveDebugValues/VarLocBasedImpl.cpp
|
|
LiveDebugValues/InstrRefBasedImpl.cpp
|
|
|
|
ADDITIONAL_HEADER_DIRS
|
|
${LLVM_MAIN_INCLUDE_DIR}/llvm/CodeGen
|
|
${LLVM_MAIN_INCLUDE_DIR}/llvm/CodeGen/PBQP
|
|
|
|
LINK_LIBS ${LLVM_PTHREAD_LIB} ${MLLinkDeps}
|
|
|
|
DEPENDS
|
|
intrinsics_gen
|
|
vt_gen
|
|
${MLDeps}
|
|
|
|
LINK_COMPONENTS
|
|
Analysis
|
|
BitReader
|
|
BitWriter
|
|
CGData
|
|
CodeGenTypes
|
|
Core
|
|
MC
|
|
ObjCARC
|
|
ProfileData
|
|
Scalar
|
|
Support
|
|
Target
|
|
TargetParser
|
|
TransformUtils
|
|
)
|
|
|
|
add_subdirectory(SelectionDAG)
|
|
add_subdirectory(AsmPrinter)
|
|
add_subdirectory(MIRParser)
|
|
add_subdirectory(GlobalISel)
|