diff --git a/clang/lib/CodeGen/CodeGenModule.cpp b/clang/lib/CodeGen/CodeGenModule.cpp --- a/clang/lib/CodeGen/CodeGenModule.cpp +++ b/clang/lib/CodeGen/CodeGenModule.cpp @@ -773,6 +773,15 @@ if (!getCodeGenOpts().RecordCommandLine.empty()) EmitCommandLineMetadata(); + if (getCodeGenOpts().StackProtectorGuard != "") + getModule().setStackProtectorGuard(getCodeGenOpts().StackProtectorGuard); + if (getCodeGenOpts().StackProtectorGuardReg != "none") + getModule().setStackProtectorGuardReg( + getCodeGenOpts().StackProtectorGuardReg); + if (getCodeGenOpts().StackProtectorGuardOffset != INT_MAX) + getModule().setStackProtectorGuardOffset( + getCodeGenOpts().StackProtectorGuardOffset); + getTargetCodeGenInfo().emitTargetMetadata(*this, MangledDeclNames); EmitBackendOptionsMetadata(getCodeGenOpts()); diff --git a/llvm/include/llvm/IR/Module.h b/llvm/include/llvm/IR/Module.h --- a/llvm/include/llvm/IR/Module.h +++ b/llvm/include/llvm/IR/Module.h @@ -895,6 +895,14 @@ FramePointerKind getFramePointer() const; void setFramePointer(FramePointerKind Kind); + // enum class StackProtectorGuards { None, TLS, Global, SysReg }; + StringRef getStackProtectorGuard() const; + void setStackProtectorGuard(StringRef Kind); + StringRef getStackProtectorGuardReg() const; + void setStackProtectorGuardReg(StringRef Reg); + int getStackProtectorGuardOffset() const; + void setStackProtectorGuardOffset(int offset); + /// @name Utility functions for querying and setting the build SDK version /// @{ diff --git a/llvm/lib/IR/Module.cpp b/llvm/lib/IR/Module.cpp --- a/llvm/lib/IR/Module.cpp +++ b/llvm/lib/IR/Module.cpp @@ -686,6 +686,42 @@ addModuleFlag(ModFlagBehavior::Max, "frame-pointer", static_cast(Kind)); } +StringRef Module::getStackProtectorGuard() const { + Metadata *MD = getModuleFlag("stack-protector-guard"); + if (auto *MDS = dyn_cast_or_null(MD)) + return MDS->getString(); + return {}; +} + +void Module::setStackProtectorGuard(StringRef Kind) { + MDString *ID = MDString::get(getContext(), Kind); + addModuleFlag(ModFlagBehavior::Warning, "stack-protector-guard", ID); +} + +StringRef Module::getStackProtectorGuardReg() const { + Metadata *MD = getModuleFlag("stack-protector-guard-reg"); + if (auto *MDS = dyn_cast_or_null(MD)) + return MDS->getString(); + return {}; +} + +void Module::setStackProtectorGuardReg(StringRef Reg) { + MDString *ID = MDString::get(getContext(), Reg); + addModuleFlag(ModFlagBehavior::Warning, "stack-protector-guard-reg", ID); +} + +int Module::getStackProtectorGuardOffset() const { + Metadata *MD = getModuleFlag("stack-protector-guard-offset"); + if (auto *CI = mdconst::dyn_extract_or_null(MD)) + return CI->getSExtValue(); + return 0; +} + +void Module::setStackProtectorGuardOffset(int offset) { + addModuleFlag(ModFlagBehavior::Warning, "stack-protector-guard-offset", + offset); +} + void Module::setSDKVersion(const VersionTuple &V) { SmallVector Entries; Entries.push_back(V.getMajor()); diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.cpp @@ -1904,10 +1904,10 @@ } Register Reg = MI.getOperand(0).getReg(); - TargetOptions Options = MI.getParent()->getParent()->getTarget().Options; - if (Options.StackProtectorGuard == StackProtectorGuards::SysReg) { + Module &M = *MBB.getParent()->getFunction().getParent(); + if (M.getStackProtectorGuard() == "sysreg") { const AArch64SysReg::SysReg *SrcReg = - AArch64SysReg::lookupSysRegByName(Options.StackProtectorGuardReg); + AArch64SysReg::lookupSysRegByName(M.getStackProtectorGuardReg()); if (!SrcReg) report_fatal_error("Unknown SysReg for Stack Protector Guard Register"); @@ -1915,7 +1915,7 @@ BuildMI(MBB, MI, DL, get(AArch64::MRS)) .addDef(Reg, RegState::Renamable) .addImm(SrcReg->Encoding); - int Offset = Options.StackProtectorGuardOffset; + int Offset = M.getStackProtectorGuardOffset(); if (Offset >= 0 && Offset <= 32760 && Offset % 8 == 0) { // ldr xN, [xN, #offset] BuildMI(MBB, MI, DL, get(AArch64::LDRXui))