Changeset View
Changeset View
Standalone View
Standalone View
clang/lib/CodeGen/TargetInfo.cpp
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 5,515 Lines • ▼ Show 20 Lines | public: | ||||
bool doesReturnSlotInterfereWithArgs() const override { return false; } | bool doesReturnSlotInterfereWithArgs() const override { return false; } | ||||
void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, | void setTargetAttributes(const Decl *D, llvm::GlobalValue *GV, | ||||
CodeGen::CodeGenModule &CGM) const override { | CodeGen::CodeGenModule &CGM) const override { | ||||
const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D); | const FunctionDecl *FD = dyn_cast_or_null<FunctionDecl>(D); | ||||
if (!FD) | if (!FD) | ||||
return; | return; | ||||
LangOptions::SignReturnAddressScopeKind Scope = | const auto *TA = FD->getAttr<TargetAttr>(); | ||||
CGM.getLangOpts().getSignReturnAddressScope(); | if (TA == nullptr) | ||||
LangOptions::SignReturnAddressKeyKind Key = | return; | ||||
CGM.getLangOpts().getSignReturnAddressKey(); | |||||
bool BranchTargetEnforcement = CGM.getLangOpts().BranchTargetEnforcement; | |||||
if (const auto *TA = FD->getAttr<TargetAttr>()) { | |||||
ParsedTargetAttr Attr = TA->parse(); | ParsedTargetAttr Attr = TA->parse(); | ||||
if (!Attr.BranchProtection.empty()) { | if (Attr.BranchProtection.empty()) | ||||
return; | |||||
TargetInfo::BranchProtectionInfo BPI; | TargetInfo::BranchProtectionInfo BPI; | ||||
StringRef Error; | StringRef Error; | ||||
(void)CGM.getTarget().validateBranchProtection(Attr.BranchProtection, | (void)CGM.getTarget().validateBranchProtection(Attr.BranchProtection, | ||||
BPI, Error); | BPI, Error); | ||||
assert(Error.empty()); | assert(Error.empty()); | ||||
Scope = BPI.SignReturnAddr; | |||||
Key = BPI.SignKey; | |||||
BranchTargetEnforcement = BPI.BranchTargetEnforcement; | |||||
} | |||||
} | |||||
auto *Fn = cast<llvm::Function>(GV); | auto *Fn = cast<llvm::Function>(GV); | ||||
if (Scope != LangOptions::SignReturnAddressScopeKind::None) { | static const char *SignReturnAddrStr[] = {"none", "non-leaf", "all"}; | ||||
Fn->addFnAttr("sign-return-address", | Fn->addFnAttr("sign-return-address", SignReturnAddrStr[static_cast<int>(BPI.SignReturnAddr)]); | ||||
Scope == LangOptions::SignReturnAddressScopeKind::All | |||||
? "all" | |||||
: "non-leaf"); | |||||
if (BPI.SignReturnAddr != LangOptions::SignReturnAddressScopeKind::None) { | |||||
Fn->addFnAttr("sign-return-address-key", | Fn->addFnAttr("sign-return-address-key", | ||||
Key == LangOptions::SignReturnAddressKeyKind::AKey | BPI.SignKey == LangOptions::SignReturnAddressKeyKind::AKey | ||||
? "a_key" | ? "a_key" | ||||
: "b_key"); | : "b_key"); | ||||
} | } | ||||
if (BranchTargetEnforcement) | Fn->addFnAttr("branch-target-enforcement", | ||||
Fn->addFnAttr("branch-target-enforcement"); | BPI.BranchTargetEnforcement ? "true" : "false"); | ||||
} | } | ||||
}; | }; | ||||
class WindowsAArch64TargetCodeGenInfo : public AArch64TargetCodeGenInfo { | class WindowsAArch64TargetCodeGenInfo : public AArch64TargetCodeGenInfo { | ||||
public: | public: | ||||
WindowsAArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind K) | WindowsAArch64TargetCodeGenInfo(CodeGenTypes &CGT, AArch64ABIInfo::ABIKind K) | ||||
: AArch64TargetCodeGenInfo(CGT, K) {} | : AArch64TargetCodeGenInfo(CGT, K) {} | ||||
▲ Show 20 Lines • Show All 5,622 Lines • Show Last 20 Lines |