Author: Yuanfang Chen Date: 2022-02-10T14:17:37-08:00 New Revision: b380a31de084a540cfa38b72e609b25ea0569bb7
URL: https://github.com/llvm/llvm-project/commit/b380a31de084a540cfa38b72e609b25ea0569bb7 DIFF: https://github.com/llvm/llvm-project/commit/b380a31de084a540cfa38b72e609b25ea0569bb7.diff LOG: Revert "[clang-cl] Support the /JMC flag" This reverts commit bd3a1de683f80d174ea9c97000db3ec3276bc022. Break bots: https://luci-milo.appspot.com/ui/p/fuchsia/builders/toolchain.ci/clang-windows-x64/b8822587673277278177/overview Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/CodeGenOptions.def clang/include/clang/Basic/DiagnosticDriverKinds.td clang/include/clang/Driver/Options.td clang/lib/CodeGen/BackendUtil.cpp clang/lib/Driver/ToolChains/Clang.cpp clang/test/Driver/cl-options.c llvm/include/llvm/CodeGen/CommandFlags.h llvm/include/llvm/CodeGen/Passes.h llvm/include/llvm/InitializePasses.h llvm/include/llvm/LinkAllPasses.h llvm/include/llvm/Target/TargetOptions.h llvm/lib/CodeGen/CMakeLists.txt llvm/lib/CodeGen/CodeGen.cpp llvm/lib/CodeGen/CommandFlags.cpp llvm/lib/Target/AArch64/AArch64TargetMachine.cpp llvm/lib/Target/ARM/ARMTargetMachine.cpp llvm/lib/Target/X86/X86TargetMachine.cpp llvm/tools/opt/opt.cpp Removed: llvm/lib/CodeGen/JMCInstrumenter.cpp llvm/test/Instrumentation/JustMyCode/jmc-instrument-x86.ll llvm/test/Instrumentation/JustMyCode/jmc-instrument.ll ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index ba8e028eb6aea..9055514d80293 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -80,12 +80,6 @@ Attribute Changes in Clang Windows Support --------------- -- Add support for MSVC-compatible ``/JMC``/``/JMC-`` flag in clang-cl (supports - X86/X64/ARM/ARM64). ``/JMC`` could only be used when ``/Zi`` or ``/Z7`` is - turned on. With this addition, clang-cl can be used in Visual Studio for the - JustMyCode feature. Note, you may need to manually add ``/JMC`` as additional - compile options in the Visual Studio since it currently assumes clang-cl does not support ``/JMC``. - C Language Changes in Clang --------------------------- diff --git a/clang/include/clang/Basic/CodeGenOptions.def b/clang/include/clang/Basic/CodeGenOptions.def index 1df5168c7d4ec..ec1b13f40d453 100644 --- a/clang/include/clang/Basic/CodeGenOptions.def +++ b/clang/include/clang/Basic/CodeGenOptions.def @@ -144,7 +144,6 @@ VALUE_CODEGENOPT(PatchableFunctionEntryOffset , 32, 0) CODEGENOPT(HotPatch, 1, 0) ///< Supports the Microsoft /HOTPATCH flag and ///< generates a 'patchable-function' attribute. -CODEGENOPT(JMCInstrument, 1, 0) ///< Set when -fjmc is enabled. CODEGENOPT(InstrumentForProfiling , 1, 0) ///< Set when -pg is enabled. CODEGENOPT(CallFEntry , 1, 0) ///< Set when -mfentry is enabled. CODEGENOPT(MNopMCount , 1, 0) ///< Set when -mnop-mcount is enabled. diff --git a/clang/include/clang/Basic/DiagnosticDriverKinds.td b/clang/include/clang/Basic/DiagnosticDriverKinds.td index 427cb788c3a4c..51a10ab54953c 100644 --- a/clang/include/clang/Basic/DiagnosticDriverKinds.td +++ b/clang/include/clang/Basic/DiagnosticDriverKinds.td @@ -633,8 +633,4 @@ def err_drv_invalid_or_unsupported_offload_target : Error< "invalid or unsupported offload target: '%0'">; def err_drv_cuda_offload_only_emit_bc : Error< "CUDA offload target is supported only along with --emit-llvm">; - -def warn_drv_jmc_requires_debuginfo : Warning< - "/JMC requires debug info. Use '/Zi', '/Z7' or other debug options; option ignored">, - InGroup<OptionIgnored>; } diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td index 6be3aa117220e..d668118e58a0b 100644 --- a/clang/include/clang/Driver/Options.td +++ b/clang/include/clang/Driver/Options.td @@ -1446,9 +1446,6 @@ def fno_elide_type : Flag<["-"], "fno-elide-type">, Group<f_Group>, HelpText<"Do not elide types when printing diagnostics">, MarshallingInfoNegativeFlag<DiagnosticOpts<"ElideType">>; def feliminate_unused_debug_symbols : Flag<["-"], "feliminate-unused-debug-symbols">, Group<f_Group>; -def fjmc : Flag<["-"], "fjmc">, Group<f_Group>,Flags<[CC1Option]>, - HelpText<"Enable just-my-code debugging">, - MarshallingInfoFlag<CodeGenOpts<"JMCInstrument">>; defm eliminate_unused_debug_types : OptOutCC1FFlag<"eliminate-unused-debug-types", "Do not emit ", "Emit ", " debug info for defined but unused types">; def femit_all_decls : Flag<["-"], "femit-all-decls">, Group<f_Group>, Flags<[CC1Option]>, @@ -6364,10 +6361,6 @@ def _SLASH_GX_ : CLFlag<"GX-">, def _SLASH_imsvc : CLJoinedOrSeparate<"imsvc">, HelpText<"Add <dir> to system include search path, as if in %INCLUDE%">, MetaVarName<"<dir>">; -def _SLASH_JMC : CLFlag<"JMC">, - HelpText<"Enable just-my-code debugging">; -def _SLASH_JMC_ : CLFlag<"JMC-">, - HelpText<"Disable just-my-code debugging (default)">; def _SLASH_LD : CLFlag<"LD">, HelpText<"Create DLL">; def _SLASH_LDd : CLFlag<"LDd">, HelpText<"Create debug DLL">; def _SLASH_link : CLRemainingArgsJoined<"link">, @@ -6468,6 +6461,7 @@ def _SLASH_errorReport : CLIgnoredJoined<"errorReport">; def _SLASH_FC : CLIgnoredFlag<"FC">; def _SLASH_Fd : CLIgnoredJoined<"Fd">; def _SLASH_FS : CLIgnoredFlag<"FS">; +def _SLASH_JMC : CLIgnoredFlag<"JMC">; def _SLASH_kernel_ : CLIgnoredFlag<"kernel-">; def _SLASH_nologo : CLIgnoredFlag<"nologo">; def _SLASH_RTC : CLIgnoredJoined<"RTC">; diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp index f3026040ad216..a4d330c0ba935 100644 --- a/clang/lib/CodeGen/BackendUtil.cpp +++ b/clang/lib/CodeGen/BackendUtil.cpp @@ -606,10 +606,6 @@ static bool initTargetOptions(DiagnosticsEngine &Diags, Options.EnableAIXExtendedAltivecABI = CodeGenOpts.EnableAIXExtendedAltivecABI; Options.XRayOmitFunctionIndex = CodeGenOpts.XRayOmitFunctionIndex; Options.LoopAlignment = CodeGenOpts.LoopAlignment; - Options.DebugStrictDwarf = CodeGenOpts.DebugStrictDwarf; - Options.ObjectFilenameForDebug = CodeGenOpts.ObjectFilenameForDebug; - Options.Hotpatch = CodeGenOpts.HotPatch; - Options.JMCInstrument = CodeGenOpts.JMCInstrument; switch (CodeGenOpts.getSwiftAsyncFramePointer()) { case CodeGenOptions::SwiftAsyncFramePointerKind::Auto: @@ -648,6 +644,9 @@ static bool initTargetOptions(DiagnosticsEngine &Diags, Entry.IgnoreSysRoot ? Entry.Path : HSOpts.Sysroot + Entry.Path); Options.MCOptions.Argv0 = CodeGenOpts.Argv0; Options.MCOptions.CommandLineArgs = CodeGenOpts.CommandLineArgs; + Options.DebugStrictDwarf = CodeGenOpts.DebugStrictDwarf; + Options.ObjectFilenameForDebug = CodeGenOpts.ObjectFilenameForDebug; + Options.Hotpatch = CodeGenOpts.HotPatch; return true; } diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp index fb71f98ac7dbd..972f7c796cc27 100644 --- a/clang/lib/Driver/ToolChains/Clang.cpp +++ b/clang/lib/Driver/ToolChains/Clang.cpp @@ -7489,16 +7489,6 @@ void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType, } const Driver &D = getToolChain().getDriver(); - - // This controls whether or not we perform JustMyCode instrumentation. - if (Args.hasFlag(options::OPT__SLASH_JMC, options::OPT__SLASH_JMC_, - /*Default=*/false)) { - if (*EmitCodeView && *DebugInfoKind >= codegenoptions::DebugInfoConstructor) - CmdArgs.push_back("-fjmc"); - else - D.Diag(clang::diag::warn_drv_jmc_requires_debuginfo); - } - EHFlags EH = parseClangCLEHFlags(D, Args); if (!isNVPTX && (EH.Synch || EH.Asynch)) { if (types::isCXX(InputType)) diff --git a/clang/test/Driver/cl-options.c b/clang/test/Driver/cl-options.c index ae94d86eb94ca..f152c9f69819d 100644 --- a/clang/test/Driver/cl-options.c +++ b/clang/test/Driver/cl-options.c @@ -486,6 +486,7 @@ // RUN: /GZ \ // RUN: /H \ // RUN: /homeparams \ +// RUN: /JMC \ // RUN: /kernel \ // RUN: /LN \ // RUN: /MP \ @@ -776,14 +777,4 @@ // RUN: %clang_cl -target i686-pc-windows-msvc19.14.0 -### -- %s 2>&1 | FileCheck -check-prefix=TARGET %s // TARGET: "-triple" "i686-pc-windows-msvc19.14.0" -// RUN: %clang_cl /JMC /c -### -- %s 2>&1 | FileCheck %s --check-prefix JMCWARN -// JMCWARN: /JMC requires debug info. Use '/Zi', '/Z7' or other debug options; option ignored - -// RUN: %clang_cl /JMC /c -### -- %s 2>&1 | FileCheck %s --check-prefix NOJMC -// RUN: %clang_cl /JMC /Z7 /JMC- /c -### -- %s 2>&1 | FileCheck %s --check-prefix NOJMC -// NOJMC-NOT: -fjmc - -// RUN: %clang_cl /JMC /Z7 /c -### -- %s 2>&1 | FileCheck %s --check-prefix JMC -// JMC: -fjmc - void f(void) { } diff --git a/llvm/include/llvm/CodeGen/CommandFlags.h b/llvm/include/llvm/CodeGen/CommandFlags.h index aa91367f65b80..c64ed3dfe1424 100644 --- a/llvm/include/llvm/CodeGen/CommandFlags.h +++ b/llvm/include/llvm/CodeGen/CommandFlags.h @@ -142,8 +142,6 @@ bool getDebugStrictDwarf(); unsigned getAlignLoops(); -bool getJMCInstrument(); - /// Create this object with static storage to register codegen-related command /// line options. struct RegisterCodeGenFlags { diff --git a/llvm/include/llvm/CodeGen/Passes.h b/llvm/include/llvm/CodeGen/Passes.h index 77337c4a8e84b..616ab10341334 100644 --- a/llvm/include/llvm/CodeGen/Passes.h +++ b/llvm/include/llvm/CodeGen/Passes.h @@ -554,9 +554,6 @@ namespace llvm { /// When learning an eviction policy, extract score(reward) information, /// otherwise this does nothing FunctionPass *createRegAllocScoringPass(); - - /// JMC instrument pass. - ModulePass *createJMCInstrumenterPass(); } // End llvm namespace #endif diff --git a/llvm/include/llvm/InitializePasses.h b/llvm/include/llvm/InitializePasses.h index 16870b924dd24..489ef045796f0 100644 --- a/llvm/include/llvm/InitializePasses.h +++ b/llvm/include/llvm/InitializePasses.h @@ -215,7 +215,6 @@ void initializeInterleavedAccessPass(PassRegistry&); void initializeInterleavedLoadCombinePass(PassRegistry &); void initializeInternalizeLegacyPassPass(PassRegistry&); void initializeIntervalPartitionPass(PassRegistry&); -void initializeJMCInstrumenterPass(PassRegistry&); void initializeJumpThreadingPass(PassRegistry&); void initializeLCSSAVerificationPassPass(PassRegistry&); void initializeLCSSAWrapperPassPass(PassRegistry&); diff --git a/llvm/include/llvm/LinkAllPasses.h b/llvm/include/llvm/LinkAllPasses.h index 0e7432ba3f537..c8b9aaeed76a5 100644 --- a/llvm/include/llvm/LinkAllPasses.h +++ b/llvm/include/llvm/LinkAllPasses.h @@ -123,7 +123,6 @@ namespace { (void) llvm::createInstSimplifyLegacyPass(); (void) llvm::createInstructionCombiningPass(); (void) llvm::createInternalizePass(); - (void) llvm::createJMCInstrumenterPass(); (void) llvm::createLCSSAPass(); (void) llvm::createLegacyDivergenceAnalysisPass(); (void) llvm::createLICMPass(); diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h index 4ced520a16a24..caa68238ab0f7 100644 --- a/llvm/include/llvm/Target/TargetOptions.h +++ b/llvm/include/llvm/Target/TargetOptions.h @@ -142,7 +142,7 @@ namespace llvm { SupportsDebugEntryValues(false), EnableDebugEntryValues(false), ValueTrackingVariableLocations(false), ForceDwarfFrameSection(false), XRayOmitFunctionIndex(false), DebugStrictDwarf(false), - Hotpatch(false), PPCGenScalarMASSEntries(false), JMCInstrument(false), + Hotpatch(false), PPCGenScalarMASSEntries(false), FPDenormalMode(DenormalMode::IEEE, DenormalMode::IEEE) {} /// DisableFramePointerElim - This returns true if frame pointer elimination @@ -348,9 +348,6 @@ namespace llvm { /// Enables scalar MASS conversions unsigned PPCGenScalarMASSEntries : 1; - /// Enable JustMyCode instrumentation. - unsigned JMCInstrument : 1; - /// Name of the stack usage file (i.e., .su file) if user passes /// -fstack-usage. If empty, it can be implied that -fstack-usage is not /// passed on the command line. diff --git a/llvm/lib/CodeGen/CMakeLists.txt b/llvm/lib/CodeGen/CMakeLists.txt index 11466c2fbf7ab..e2adb3e18a393 100644 --- a/llvm/lib/CodeGen/CMakeLists.txt +++ b/llvm/lib/CodeGen/CMakeLists.txt @@ -75,7 +75,6 @@ add_llvm_component_library(LLVMCodeGen InterleavedAccessPass.cpp InterleavedLoadCombinePass.cpp IntrinsicLowering.cpp - JMCInstrumenter.cpp LatencyPriorityQueue.cpp LazyMachineBlockFrequencyInfo.cpp LexicalScopes.cpp diff --git a/llvm/lib/CodeGen/CodeGen.cpp b/llvm/lib/CodeGen/CodeGen.cpp index 7e7fb420e3153..7c236a9785d8e 100644 --- a/llvm/lib/CodeGen/CodeGen.cpp +++ b/llvm/lib/CodeGen/CodeGen.cpp @@ -50,7 +50,6 @@ void llvm::initializeCodeGen(PassRegistry &Registry) { initializeIndirectBrExpandPassPass(Registry); initializeInterleavedLoadCombinePass(Registry); initializeInterleavedAccessPass(Registry); - initializeJMCInstrumenterPass(Registry); initializeLiveDebugValuesPass(Registry); initializeLiveDebugVariablesPass(Registry); initializeLiveIntervalsPass(Registry); diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp index 87758c4983cb2..cb77407d0377e 100644 --- a/llvm/lib/CodeGen/CommandFlags.cpp +++ b/llvm/lib/CodeGen/CommandFlags.cpp @@ -95,7 +95,6 @@ CGOPT(bool, ForceDwarfFrameSection) CGOPT(bool, XRayOmitFunctionIndex) CGOPT(bool, DebugStrictDwarf) CGOPT(unsigned, AlignLoops) -CGOPT(bool, JMCInstrument) codegen::RegisterCodeGenFlags::RegisterCodeGenFlags() { #define CGBINDOPT(NAME) \ @@ -465,12 +464,6 @@ codegen::RegisterCodeGenFlags::RegisterCodeGenFlags() { cl::desc("Default alignment for loops")); CGBINDOPT(AlignLoops); - static cl::opt<bool> JMCInstrument( - "enable-jmc-instrument", - cl::desc("Instrument functions with a call to __CheckForDebuggerJustMyCode"), - cl::init(false)); - CGBINDOPT(JMCInstrument); - #undef CGBINDOPT mc::RegisterMCTargetOptionsFlags(); @@ -546,7 +539,6 @@ codegen::InitTargetOptionsFromCodeGenFlags(const Triple &TheTriple) { Options.XRayOmitFunctionIndex = getXRayOmitFunctionIndex(); Options.DebugStrictDwarf = getDebugStrictDwarf(); Options.LoopAlignment = getAlignLoops(); - Options.JMCInstrument = getJMCInstrument(); Options.MCOptions = mc::InitMCTargetOptionsFromFlags(); diff --git a/llvm/lib/CodeGen/JMCInstrumenter.cpp b/llvm/lib/CodeGen/JMCInstrumenter.cpp deleted file mode 100644 index b9f686f0782eb..0000000000000 --- a/llvm/lib/CodeGen/JMCInstrumenter.cpp +++ /dev/null @@ -1,207 +0,0 @@ -//===- JMCInstrumenter.cpp - JMC Instrumentation --------------------------===// -// -// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. -// See https://llvm.org/LICENSE.txt for license information. -// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception -// -//===----------------------------------------------------------------------===// -// -// JMCInstrumenter pass: -// - add "/alternatename:__CheckForDebuggerJustMyCode=__JustMyCode_Default" to -// "llvm.linker.options" -// - create the dummy COMDAT function __JustMyCode_Default -// - instrument each function with a call to __CheckForDebuggerJustMyCode. The -// sole argument should be defined in .msvcjmc. Each flag is 1 byte initilized -// to 1. -// - (TODO) currently targeting MSVC, adds ELF debuggers support -// -//===----------------------------------------------------------------------===// - -#include "llvm/ADT/SmallString.h" -#include "llvm/ADT/StringExtras.h" -#include "llvm/CodeGen/Passes.h" -#include "llvm/IR/DIBuilder.h" -#include "llvm/IR/DebugInfoMetadata.h" -#include "llvm/IR/DerivedTypes.h" -#include "llvm/IR/Function.h" -#include "llvm/IR/Instructions.h" -#include "llvm/IR/LLVMContext.h" -#include "llvm/IR/Module.h" -#include "llvm/IR/Type.h" -#include "llvm/InitializePasses.h" -#include "llvm/Pass.h" -#include "llvm/Support/DJB.h" -#include "llvm/Support/Path.h" -#include "llvm/Transforms/Utils/ModuleUtils.h" - -using namespace llvm; - -#define DEBUG_TYPE "jmc-instrument" - -namespace { -struct JMCInstrumenter : public ModulePass { - static char ID; - JMCInstrumenter() : ModulePass(ID) { - initializeJMCInstrumenterPass(*PassRegistry::getPassRegistry()); - } - bool runOnModule(Module &M) override; -}; -char JMCInstrumenter::ID = 0; -} // namespace - -INITIALIZE_PASS( - JMCInstrumenter, DEBUG_TYPE, - "Instrument function entry with call to __CheckForDebuggerJustMyCode", - false, false) - -ModulePass *llvm::createJMCInstrumenterPass() { return new JMCInstrumenter(); } - -namespace { -const char CheckFunctionName[] = "__CheckForDebuggerJustMyCode"; - -std::string getFlagName(DISubprogram &SP, bool UseX86FastCall) { - // Best effort path normalization. This is to guarantee an unique flag symbol - // is produced for the same directory. Some builds may want to use relative - // paths, or paths with a specific prefix (see the -fdebug-compilation-dir - // flag), so only hash paths in debuginfo. Don't expand them to absolute - // paths. - SmallString<256> FilePath(SP.getDirectory()); - sys::path::append(FilePath, SP.getFilename()); - sys::path::native(FilePath); - sys::path::remove_dots(FilePath, /*remove_dot_dot=*/true); - - // The naming convention for the flag name is __<hash>_<file name> with '.' in - // <file name> replaced with '@'. For example C:\file.any.c would have a flag - // __D032E919_file@any@c. The naming convention match MSVC's format however - // the match is not required to make JMC work. The hashing function used here - // is diff erent from MSVC's. - - std::string Suffix; - for (auto C : sys::path::filename(FilePath)) - Suffix.push_back(C == '.' ? '@' : C); - - sys::path::remove_filename(FilePath); - return (UseX86FastCall ? "_" : "__") + - utohexstr(djbHash(FilePath), /*LowerCase=*/false, - /*Width=*/8) + - "_" + Suffix; -} - -void attachDebugInfo(GlobalVariable &GV, DISubprogram &SP) { - Module &M = *GV.getParent(); - DICompileUnit *CU = SP.getUnit(); - assert(CU); - DIBuilder DB(M, false, CU); - - auto *DType = - DB.createBasicType("unsigned char", 8, dwarf::DW_ATE_unsigned_char, - llvm::DINode::FlagArtificial); - - auto *DGVE = DB.createGlobalVariableExpression( - CU, GV.getName(), /*LinkageName=*/StringRef(), SP.getFile(), - /*LineNo=*/0, DType, /*IsLocalToUnit=*/true, /*IsDefined=*/true); - GV.addMetadata(LLVMContext::MD_dbg, *DGVE); - DB.finalize(); -} - -FunctionType *getCheckFunctionType(LLVMContext &Ctx) { - Type *VoidTy = Type::getVoidTy(Ctx); - PointerType *VoidPtrTy = Type::getInt8PtrTy(Ctx); - return FunctionType::get(VoidTy, VoidPtrTy, false); -} - -void createDefaultCheckFunction(Module &M, bool UseX86FastCall) { - LLVMContext &Ctx = M.getContext(); - const char *DefaultCheckFunctionName = - UseX86FastCall ? "_JustMyCode_Default" : "__JustMyCode_Default"; - // Create the function. - Function *DefaultCheckFunc = - Function::Create(getCheckFunctionType(Ctx), GlobalValue::ExternalLinkage, - DefaultCheckFunctionName, &M); - DefaultCheckFunc->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); - DefaultCheckFunc->addParamAttr(0, Attribute::NoUndef); - if (UseX86FastCall) - DefaultCheckFunc->addParamAttr(0, Attribute::InReg); - appendToUsed(M, {DefaultCheckFunc}); - Comdat *C = M.getOrInsertComdat(DefaultCheckFunctionName); - C->setSelectionKind(Comdat::Any); - DefaultCheckFunc->setComdat(C); - BasicBlock *EntryBB = BasicBlock::Create(Ctx, "", DefaultCheckFunc); - ReturnInst::Create(Ctx, EntryBB); - - // Add a linker option /alternatename to set the default implementation for - // the check function. - // https://devblogs.microsoft.com/oldnewthing/20200731-00/?p=104024 - std::string AltOption = std::string("/alternatename:") + CheckFunctionName + - "=" + DefaultCheckFunctionName; - llvm::Metadata *Ops[] = {llvm::MDString::get(Ctx, AltOption)}; - MDTuple *N = MDNode::get(Ctx, Ops); - M.getOrInsertNamedMetadata("llvm.linker.options")->addOperand(N); -} -} // namespace - -bool JMCInstrumenter::runOnModule(Module &M) { - bool Changed = false; - LLVMContext &Ctx = M.getContext(); - Triple ModuleTriple(M.getTargetTriple()); - bool UseX86FastCall = - ModuleTriple.isOSWindows() && ModuleTriple.getArch() == Triple::x86; - - Function *CheckFunction = nullptr; - DenseMap<DISubprogram *, Constant *> SavedFlags(8); - for (auto &F : M) { - if (F.isDeclaration()) - continue; - auto *SP = F.getSubprogram(); - if (!SP) - continue; - - Constant *&Flag = SavedFlags[SP]; - if (!Flag) { - std::string FlagName = getFlagName(*SP, UseX86FastCall); - IntegerType *FlagTy = Type::getInt8Ty(Ctx); - Flag = M.getOrInsertGlobal(FlagName, FlagTy, [&] { - // FIXME: Put the GV in comdat and have linkonce_odr linkage to save - // .msvcjmc section space? maybe not worth it. - GlobalVariable *GV = new GlobalVariable( - M, FlagTy, /*isConstant=*/false, GlobalValue::InternalLinkage, - ConstantInt::get(FlagTy, 1), FlagName); - GV->setSection(".msvcjmc"); - GV->setAlignment(Align(1)); - GV->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); - attachDebugInfo(*GV, *SP); - return GV; - }); - } - - if (!CheckFunction) { - assert(!M.getFunction(CheckFunctionName) && - "JMC instrument more than once?"); - CheckFunction = cast<Function>( - M.getOrInsertFunction(CheckFunctionName, getCheckFunctionType(Ctx)) - .getCallee()); - CheckFunction->setUnnamedAddr(GlobalValue::UnnamedAddr::Global); - CheckFunction->addParamAttr(0, Attribute::NoUndef); - if (UseX86FastCall) { - CheckFunction->setCallingConv(CallingConv::X86_FastCall); - CheckFunction->addParamAttr(0, Attribute::InReg); - } - } - // FIXME: it would be nice to make CI scheduling boundary, although in - // practice it does not matter much. - auto *CI = CallInst::Create(CheckFunction, {Flag}, "", - &*F.begin()->getFirstInsertionPt()); - CI->addParamAttr(0, Attribute::NoUndef); - if (UseX86FastCall) { - CI->setCallingConv(CallingConv::X86_FastCall); - CI->addParamAttr(0, Attribute::InReg); - } - - Changed = true; - } - if (!Changed) - return false; - - createDefaultCheckFunction(M, UseX86FastCall); - return true; -} diff --git a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp index ab8ee0beca041..4af28fc070dd0 100644 --- a/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp +++ b/llvm/lib/Target/AArch64/AArch64TargetMachine.cpp @@ -574,9 +574,6 @@ void AArch64PassConfig::addIRPasses() { // Add Control Flow Guard checks. if (TM->getTargetTriple().isOSWindows()) addPass(createCFGuardCheckPass()); - - if (TM->Options.JMCInstrument) - addPass(createJMCInstrumenterPass()); } // Pass Pipeline Configuration diff --git a/llvm/lib/Target/ARM/ARMTargetMachine.cpp b/llvm/lib/Target/ARM/ARMTargetMachine.cpp index e067c9a8d0f70..c38970f8e3414 100644 --- a/llvm/lib/Target/ARM/ARMTargetMachine.cpp +++ b/llvm/lib/Target/ARM/ARMTargetMachine.cpp @@ -434,9 +434,6 @@ void ARMPassConfig::addIRPasses() { // Add Control Flow Guard checks. if (TM->getTargetTriple().isOSWindows()) addPass(createCFGuardCheckPass()); - - if (TM->Options.JMCInstrument) - addPass(createJMCInstrumenterPass()); } void ARMPassConfig::addCodeGenPrepare() { diff --git a/llvm/lib/Target/X86/X86TargetMachine.cpp b/llvm/lib/Target/X86/X86TargetMachine.cpp index 537edaac7af70..e3d0128dd73da 100644 --- a/llvm/lib/Target/X86/X86TargetMachine.cpp +++ b/llvm/lib/Target/X86/X86TargetMachine.cpp @@ -441,9 +441,6 @@ void X86PassConfig::addIRPasses() { addPass(createCFGuardCheckPass()); } } - - if (TM->Options.JMCInstrument) - addPass(createJMCInstrumenterPass()); } bool X86PassConfig::addInstSelector() { diff --git a/llvm/test/Instrumentation/JustMyCode/jmc-instrument-x86.ll b/llvm/test/Instrumentation/JustMyCode/jmc-instrument-x86.ll deleted file mode 100644 index b38fc29c54c3d..0000000000000 --- a/llvm/test/Instrumentation/JustMyCode/jmc-instrument-x86.ll +++ /dev/null @@ -1,53 +0,0 @@ -; RUN: opt -jmc-instrument -S < %s | FileCheck %s - -; CHECK: $_JustMyCode_Default = comdat any - -; CHECK: @"_A85D9D03_x@c" = internal unnamed_addr global i8 1, section ".msvcjmc", align 1, !dbg !0 -; CHECK: @llvm.used = appending global [1 x i8*] [i8* bitcast (void (i8*)* @_JustMyCode_Default to i8*)], section "llvm.metadata" - -; CHECK: define void @w1() #0 !dbg !10 { -; CHECK: call x86_fastcallcc void @__CheckForDebuggerJustMyCode(i8* inreg noundef @"_A85D9D03_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: declare x86_fastcallcc void @__CheckForDebuggerJustMyCode(i8* inreg noundef) unnamed_addr - -; CHECK: define void @_JustMyCode_Default(i8* inreg noundef %0) unnamed_addr comdat { -; CHECK: ret void -; CHECK: } - -; CHECK: !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) -; CHECK: !1 = distinct !DIGlobalVariable(name: "_A85D9D03_x@c", scope: !2, file: !3, type: !5, isLocal: true, isDefinition: true) -; CHECK: !2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None) -; CHECK: !3 = !DIFile(filename: "./b/./../b/x.c", directory: "C:\\\\a\\\\") -; CHECK: !4 = !{!0} -; CHECK: !5 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char, flags: DIFlagArtificial) -; CHECK: !6 = !{i32 2, !"CodeView", i32 1} -; CHECK: !7 = !{i32 2, !"Debug Info Version", i32 3} -; CHECK: !8 = !{!"clang"} -; CHECK: !9 = !{!"/alternatename:__CheckForDebuggerJustMyCode=_JustMyCode_Default"} -; CHECK: !10 = distinct !DISubprogram(name: "w1", scope: !3, file: !3, line: 1, type: !11, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !13) -; CHECK: !11 = !DISubroutineType(types: !12) - -target datalayout = "e-m:x-p:32:32-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32-a:0:32-S32" -target triple = "i386-pc-windows-msvc" - -define void @w1() #0 !dbg !10 { - ret void -} - -attributes #0 = { "target-cpu"="pentium4" "target-features"="+cx8,+fxsr,+mmx,+sse,+sse2,+x87" "tune-cpu"="generic" } - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!7, !8} -!llvm.ident = !{!9} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) -!1 = !DIFile(filename: "./b/./../b/x.c", directory: "C:\\\\a\\\\") -!7 = !{i32 2, !"CodeView", i32 1} -!8 = !{i32 2, !"Debug Info Version", i32 3} -!9 = !{!"clang"} -!10 = distinct !DISubprogram(name: "w1", scope: !1, file: !1, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!31 = !DISubroutineType(types: !32) -!32 = !{null} -!33 = !{} diff --git a/llvm/test/Instrumentation/JustMyCode/jmc-instrument.ll b/llvm/test/Instrumentation/JustMyCode/jmc-instrument.ll deleted file mode 100644 index c2ebbbcfe1771..0000000000000 --- a/llvm/test/Instrumentation/JustMyCode/jmc-instrument.ll +++ /dev/null @@ -1,120 +0,0 @@ -; RUN: opt -jmc-instrument -mtriple=x86_64-pc-windows-msvc -S < %s | FileCheck %s -; RUN: opt -jmc-instrument -mtriple=aarch64-pc-windows-msvc -S < %s | FileCheck %s -; RUN: opt -jmc-instrument -mtriple=arm-pc-windows-msvc -S < %s | FileCheck %s - -; CHECK: $__JustMyCode_Default = comdat any - -; CHECK: @"__7DF23CF5_x@c" = internal unnamed_addr global i8 1, section ".msvcjmc", align 1, !dbg !0 -; CHECK: @"__A85D9D03_x@c" = internal unnamed_addr global i8 1, section ".msvcjmc", align 1, !dbg !5 -; CHECK: @llvm.used = appending global [1 x i8*] [i8* bitcast (void (i8*)* @__JustMyCode_Default to i8*)], section "llvm.metadata" - -; CHECK: define void @l1() !dbg !13 { -; CHECK: call void @__CheckForDebuggerJustMyCode(i8* noundef @"__7DF23CF5_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: define void @l2() !dbg !17 { -; CHECK: call void @__CheckForDebuggerJustMyCode(i8* noundef @"__7DF23CF5_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: define void @w1() !dbg !19 { -; CHECK: call void @__CheckForDebuggerJustMyCode(i8* noundef @"__A85D9D03_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: define void @w2() !dbg !20 { -; CHECK: call void @__CheckForDebuggerJustMyCode(i8* noundef @"__A85D9D03_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: define void @w3() !dbg !22 { -; CHECK: call void @__CheckForDebuggerJustMyCode(i8* noundef @"__A85D9D03_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: define void @w4() !dbg !24 { -; CHECK: call void @__CheckForDebuggerJustMyCode(i8* noundef @"__A85D9D03_x@c") -; CHECK: ret void -; CHECK: } - -; CHECK: declare void @__CheckForDebuggerJustMyCode(i8* noundef) unnamed_addr - -; CHECK: define void @__JustMyCode_Default(i8* noundef %0) unnamed_addr comdat { -; CHECK: ret void -; CHECK: } - -; CHECK: !llvm.linker.options = !{!12} - -; CHECK: !0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression()) -; CHECK: !1 = distinct !DIGlobalVariable(name: "__7DF23CF5_x@c", scope: !2, file: !3, type: !8, isLocal: true, isDefinition: true) -; CHECK: !2 = distinct !DICompileUnit(language: DW_LANG_C99, file: !3, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, nameTableKind: None) -; CHECK: !3 = !DIFile(filename: "a/x.c", directory: "/tmp") -; CHECK: !4 = !{!0, !5} -; CHECK: !5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression()) -; CHECK: !6 = distinct !DIGlobalVariable(name: "__A85D9D03_x@c", scope: !2, file: !7, type: !8, isLocal: true, isDefinition: true) -; CHECK: !7 = !DIFile(filename: "./x.c", directory: "C:\\\\a\\\\b\\\\") -; CHECK: !8 = !DIBasicType(name: "unsigned char", size: 8, encoding: DW_ATE_unsigned_char, flags: DIFlagArtificial) -; CHECK: !9 = !{i32 2, !"CodeView", i32 1} -; CHECK: !10 = !{i32 2, !"Debug Info Version", i32 3} -; CHECK: !11 = !{!"clang"} -; CHECK: !12 = !{!"/alternatename:__CheckForDebuggerJustMyCode=__JustMyCode_Default"} -; CHECK: !13 = distinct !DISubprogram(name: "f", scope: !3, file: !3, line: 1, type: !14, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !16) -; CHECK: !14 = !DISubroutineType(types: !15) -; CHECK: !15 = !{null} -; CHECK: !16 = !{} -; CHECK: !17 = distinct !DISubprogram(name: "f", scope: !18, file: !18, line: 1, type: !14, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !16) -; CHECK: !18 = !DIFile(filename: "x.c", directory: "/tmp/a") -; CHECK: !19 = distinct !DISubprogram(name: "f", scope: !7, file: !7, line: 1, type: !14, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !16) -; CHECK: !20 = distinct !DISubprogram(name: "f", scope: !21, file: !21, line: 1, type: !14, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !16) -; CHECK: !21 = !DIFile(filename: "./b\\x.c", directory: "C:\\\\a\\\\") -; CHECK: !22 = distinct !DISubprogram(name: "f", scope: !23, file: !23, line: 1, type: !14, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !16) -; CHECK: !23 = !DIFile(filename: "./b/x.c", directory: "C:\\\\a\\\\") -; CHECK: !24 = distinct !DISubprogram(name: "f", scope: !25, file: !25, line: 1, type: !14, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !2, retainedNodes: !16) -; CHECK: !25 = !DIFile(filename: "./b/./../b/x.c", directory: "C:\\\\a") - -; All use the same flag -define void @l1() !dbg !10 { - ret void -} -define void @l2() !dbg !11 { - ret void -} - -; All use the same flag -define void @w1() !dbg !12 { - ret void -} -define void @w2() !dbg !13 { - ret void -} -define void @w3() !dbg !14 { - ret void -} -define void @w4() !dbg !15 { - ret void -} - -!llvm.dbg.cu = !{!0} -!llvm.module.flags = !{!7, !8} -!llvm.ident = !{!9} - -!0 = distinct !DICompileUnit(language: DW_LANG_C99, file: !1, producer: "clang", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None) -!1 = !DIFile(filename: "a/x.c", directory: "/tmp") -!2 = !DIFile(filename: "x.c", directory: "/tmp/a") -!3 = !DIFile(filename: "./x.c", directory: "C:\\\\a\\\\b\\\\") -!4 = !DIFile(filename: "./b\\x.c", directory: "C:\\\\a\\\\") -!5 = !DIFile(filename: "./b/x.c", directory: "C:\\\\a\\\\") -!6 = !DIFile(filename: "./b/./../b/x.c", directory: "C:\\\\a") -!7 = !{i32 2, !"CodeView", i32 1} -!8 = !{i32 2, !"Debug Info Version", i32 3} -!9 = !{!"clang"} -!10 = distinct !DISubprogram(name: "f", scope: !1, file: !1, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!11 = distinct !DISubprogram(name: "f", scope: !2, file: !2, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!12 = distinct !DISubprogram(name: "f", scope: !3, file: !3, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!13 = distinct !DISubprogram(name: "f", scope: !4, file: !4, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!14 = distinct !DISubprogram(name: "f", scope: !5, file: !5, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!15 = distinct !DISubprogram(name: "f", scope: !6, file: !6, line: 1, type: !31, scopeLine: 1, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !33) -!31 = !DISubroutineType(types: !32) -!32 = !{null} -!33 = !{} diff --git a/llvm/tools/opt/opt.cpp b/llvm/tools/opt/opt.cpp index b503547221986..7793a54717933 100644 --- a/llvm/tools/opt/opt.cpp +++ b/llvm/tools/opt/opt.cpp @@ -498,8 +498,7 @@ static bool shouldPinPassToLegacyPM(StringRef Pass) { "generic-to-nvvm", "expandmemcmp", "loop-reduce", "lower-amx-type", "pre-amx-config", "lower-amx-intrinsics", - "polyhedral-info", "replace-with-veclib", - "jmc-instrument"}; + "polyhedral-info", "replace-with-veclib"}; for (const auto &P : PassNamePrefix) if (Pass.startswith(P)) return true; @@ -573,7 +572,6 @@ int main(int argc, char **argv) { initializeHardwareLoopsPass(Registry); initializeTypePromotionPass(Registry); initializeReplaceWithVeclibLegacyPass(Registry); - initializeJMCInstrumenterPass(Registry); #ifdef BUILD_EXAMPLES initializeExampleIRTransforms(Registry); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits