diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index 3f095c03397fd..1929fbba8c303 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -467,7 +467,6 @@ static bool initTargetOptions(const CompilerInstance &CI, Options.LoopAlignment = CodeGenOpts.LoopAlignment; Options.DebugStrictDwarf = CodeGenOpts.DebugStrictDwarf; Options.ObjectFilenameForDebug = CodeGenOpts.ObjectFilenameForDebug; - Options.Hotpatch = CodeGenOpts.HotPatch; Options.JMCInstrument = CodeGenOpts.JMCInstrument; Options.XCOFFReadOnlyPointers = CodeGenOpts.XCOFFReadOnlyPointers; diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp index 5e96f5bd6e5f8..4c5a48c705756 100644 --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -1136,6 +1136,10 @@ void CodeGenModule::Release() { // Function ID tables for EH Continuation Guard. getModule().addModuleFlag(llvm::Module::Warning, "ehcontguard", 1); } + if (CodeGenOpts.HotPatch) { + // Note if we are compiling with /hotpatch. + getModule().addModuleFlag(llvm::Module::Warning, "ms-hotpatch", 1); + } if (Context.getLangOpts().Kernel) { // Note if we are compiling with /kernel. getModule().addModuleFlag(llvm::Module::Warning, "ms-kernel", 1); diff --git a/clang/test/CodeGen/patchable-function-entry.c b/clang/test/CodeGen/patchable-function-entry.c index 2acd748758490..b49f297abf7de 100644 --- a/clang/test/CodeGen/patchable-function-entry.c +++ b/clang/test/CodeGen/patchable-function-entry.c @@ -39,3 +39,4 @@ void f(void) {} // HOTPATCH: attributes #1 = { {{.*}} "patchable-function"="prologue-short-redirect" // HOTPATCH: attributes #2 = { {{.*}} "patchable-function"="prologue-short-redirect" // HOTPATCH: attributes #3 = { {{.*}} "patchable-function"="prologue-short-redirect" +// HOTPATCH: !{{.}} = !{i32 2, !"ms-hotpatch", i32 1} diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h index 2c2122a7b204f..c4fbd8a88c03f 100644 --- a/llvm/include/llvm/Target/TargetOptions.h +++ b/llvm/include/llvm/Target/TargetOptions.h @@ -137,10 +137,9 @@ class TargetOptions { EmitCallSiteInfo(false), SupportsDebugEntryValues(false), EnableDebugEntryValues(false), ValueTrackingVariableLocations(false), ForceDwarfFrameSection(false), XRayFunctionIndex(true), - DebugStrictDwarf(false), Hotpatch(false), - PPCGenScalarMASSEntries(false), JMCInstrument(false), - EnableCFIFixup(false), MisExpect(false), XCOFFReadOnlyPointers(false), - VerifyArgABICompliance(true), + DebugStrictDwarf(false), PPCGenScalarMASSEntries(false), + JMCInstrument(false), EnableCFIFixup(false), MisExpect(false), + XCOFFReadOnlyPointers(false), VerifyArgABICompliance(true), FPDenormalMode(DenormalMode::IEEE, DenormalMode::IEEE) {} /// DisableFramePointerElim - This returns true if frame pointer elimination @@ -347,9 +346,6 @@ class TargetOptions { /// By default, it is set to false. unsigned DebugStrictDwarf : 1; - /// Emit the hotpatch flag in CodeView debug. - unsigned Hotpatch : 1; - /// Enables scalar MASS conversions unsigned PPCGenScalarMASSEntries : 1; diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index c5d6e40eb7c1e..c3f0a1260e2f9 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -886,8 +886,8 @@ void CodeViewDebug::emitCompilerInformation() { } using ArchType = llvm::Triple::ArchType; ArchType Arch = MMI->getModule()->getTargetTriple().getArch(); - if (CompilerInfoAsm->TM.Options.Hotpatch || Arch == ArchType::thumb || - Arch == ArchType::aarch64) { + if (Arch == ArchType::thumb || Arch == ArchType::aarch64 || + MMI->getModule()->getModuleFlag("ms-hotpatch")) { Flags |= static_cast(CompileSym3Flags::HotPatch); } diff --git a/llvm/test/DebugInfo/PDB/hotpatch.test b/llvm/test/DebugInfo/PDB/hotpatch.test new file mode 100644 index 0000000000000..79267cefa43fd --- /dev/null +++ b/llvm/test/DebugInfo/PDB/hotpatch.test @@ -0,0 +1,40 @@ +; RUN: llc -filetype=obj -o - %s | llvm-readobj --codeview - | FileCheck %s + +; ModuleID = 'a.c' +source_filename = "a.c" +target datalayout = "e-m:w-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" +target triple = "x86_64-unknown-windows-msvc19.33.0" + +; Function Attrs: noinline nounwind optnone uwtable +define dso_local void @test() #0 !dbg !10 { +entry: + ret void, !dbg !13 +} + +attributes #0 = { noinline nounwind optnone uwtable "min-legal-vector-width"="0" "no-trapping-math"="true" "patchable-function"="prologue-short-redirect" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+cmov,+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } + +!llvm.dbg.cu = !{!0} +!llvm.module.flags = !{!2, !3, !4, !5, !6, !7, !8} +!llvm.ident = !{!9} + +!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 21.0.0git", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) +!1 = !DIFile(filename: "a.c", directory: "/tmp", checksumkind: CSK_MD5, checksum: "c59e1f6192de3124537b024248301dd1") +!2 = !{i32 2, !"CodeView", i32 1} +!3 = !{i32 2, !"ms-hotpatch", i32 1} +!4 = !{i32 2, !"Debug Info Version", i32 3} +!5 = !{i32 1, !"wchar_size", i32 2} +!6 = !{i32 8, !"PIC Level", i32 2} +!7 = !{i32 7, !"uwtable", i32 2} +!8 = !{i32 1, !"MaxTLSAlign", i32 65536} +!9 = !{!"clang version 21.0.0git"} +!10 = distinct !DISubprogram(name: "test", scope: !1, file: !1, line: 1, type: !11, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0) +!11 = !DISubroutineType(types: !12) +!12 = !{null} +!13 = !DILocation(line: 1, scope: !10) + +; CHECK: Compile3Sym { +; CHECK-NEXT: Kind: S_COMPILE3 (0x113C) +; CHECK-NEXT: Language: C (0x0) +; CHECK-NEXT: Flags [ (0x4000) +; CHECK-NEXT: HotPatch (0x4000) +; CHECK-NEXT: ]