From 970bfcc7d8b9991430caa7ab33975617f3f4c40d Mon Sep 17 00:00:00 2001 From: Charles Davis Date: Mon, 25 Oct 2010 15:37:09 +0000 Subject: [PATCH] Add a new 'hotpatch' attribute. This attribute will insert a two-byte no-op instruction at the beginning of each function that has the attribute, allowing the function to be easily hooked and/or patched. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@117264 91177308-0d34-0410-b5e6-96231b3b80d8 --- docs/LangRef.html | 5 +++++ include/llvm/Attributes.h | 5 ++++- lib/AsmParser/LLLexer.cpp | 1 + lib/AsmParser/LLParser.cpp | 1 + lib/AsmParser/LLToken.h | 1 + lib/VMCore/Attributes.cpp | 2 ++ 6 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/LangRef.html b/docs/LangRef.html index e5db8c69cfa..c2ee7019b96 100644 --- a/docs/LangRef.html +++ b/docs/LangRef.html @@ -1131,6 +1131,11 @@ define void @f() optsize { ... } function into callers whenever possible, ignoring any active inlining size threshold for this caller. +
hotpatch
+
This attribute indicates that the prologue should contain a 'hotpatch' + sequence at the beginning. This is the same sequence used in the + system DLLs in Microsoft Windows XP Service Pack 2 and higher.
+
inlinehint
This attribute indicates that the source code contained a hint that inlining this function is desirable (such as the "inline" keyword in C/C++). It diff --git a/include/llvm/Attributes.h b/include/llvm/Attributes.h index 0325c89626b..da6188b1a8e 100644 --- a/include/llvm/Attributes.h +++ b/include/llvm/Attributes.h @@ -65,6 +65,8 @@ const Attributes StackAlignment = 7<<26; ///< Alignment of stack for ///of alignment with +1 bias ///0 means unaligned (different from ///alignstack(1)) +const Attributes Hotpatch = 1<<29; ///< Function should have special + ///'hotpatch' sequence in prologue /// @brief Attributes that only apply to function parameters. const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture; @@ -73,7 +75,8 @@ const Attributes ParameterOnly = ByVal | Nest | StructRet | NoCapture; /// be used on return values or function parameters. const Attributes FunctionOnly = NoReturn | NoUnwind | ReadNone | ReadOnly | NoInline | AlwaysInline | OptimizeForSize | StackProtect | StackProtectReq | - NoRedZone | NoImplicitFloat | Naked | InlineHint | StackAlignment; + NoRedZone | NoImplicitFloat | Naked | InlineHint | StackAlignment | + Hotpatch; /// @brief Parameter attributes that do not apply to vararg call arguments. const Attributes VarArgsIncompatible = StructRet; diff --git a/lib/AsmParser/LLLexer.cpp b/lib/AsmParser/LLLexer.cpp index eeaadf68ea1..f924b5a9089 100644 --- a/lib/AsmParser/LLLexer.cpp +++ b/lib/AsmParser/LLLexer.cpp @@ -573,6 +573,7 @@ lltok::Kind LLLexer::LexIdentifier() { KEYWORD(noredzone); KEYWORD(noimplicitfloat); KEYWORD(naked); + KEYWORD(hotpatch); KEYWORD(type); KEYWORD(opaque); diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp index 4d3bd879320..a1f70fb0249 100644 --- a/lib/AsmParser/LLParser.cpp +++ b/lib/AsmParser/LLParser.cpp @@ -982,6 +982,7 @@ bool LLParser::ParseOptionalAttrs(unsigned &Attrs, unsigned AttrKind) { case lltok::kw_noredzone: Attrs |= Attribute::NoRedZone; break; case lltok::kw_noimplicitfloat: Attrs |= Attribute::NoImplicitFloat; break; case lltok::kw_naked: Attrs |= Attribute::Naked; break; + case lltok::kw_hotpatch: Attrs |= Attribute::Hotpatch; break; case lltok::kw_alignstack: { unsigned Alignment; diff --git a/lib/AsmParser/LLToken.h b/lib/AsmParser/LLToken.h index 8a8663e739a..72128c9ae05 100644 --- a/lib/AsmParser/LLToken.h +++ b/lib/AsmParser/LLToken.h @@ -96,6 +96,7 @@ namespace lltok { kw_noredzone, kw_noimplicitfloat, kw_naked, + kw_hotpatch, kw_type, kw_opaque, diff --git a/lib/VMCore/Attributes.cpp b/lib/VMCore/Attributes.cpp index 3422faf2730..6f5ecd278d8 100644 --- a/lib/VMCore/Attributes.cpp +++ b/lib/VMCore/Attributes.cpp @@ -70,6 +70,8 @@ std::string Attribute::getAsString(Attributes Attrs) { Result += "noimplicitfloat "; if (Attrs & Attribute::Naked) Result += "naked "; + if (Attrs & Attribute::Hotpatch) + Result += "hotpatch "; if (Attrs & Attribute::StackAlignment) { Result += "alignstack("; Result += utostr(Attribute::getStackAlignmentFromAttrs(Attrs));