From 9c33e02eb384f9a9833773c43eda349b0efff73b Mon Sep 17 00:00:00 2001
From: Simon Schuster <git@rationality.eu>
Date: Sat, 13 May 2017 00:39:31 +0200
Subject: [PATCH] Add `#pragma platina callee` to the frontend.

What it says on the tin. Parsing only.
---
 include/clang/Basic/Attr.td  |  2 +-
 include/clang/Parse/Parser.h |  1 +
 lib/Parse/ParsePragma.cpp    | 10 ++++++++++
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td
index 5a16f53208..e03bc9b30a 100644
--- a/include/clang/Basic/Attr.td
+++ b/include/clang/Basic/Attr.td
@@ -2183,7 +2183,7 @@ def Loopbound : Attr {
 
 def Platina : Attr {
   // #pragma platina guard <str>
-  let Spellings = [Pragma<"platina", "guard">];
+  let Spellings = [Pragma<"platina", "guard">, Pragma<"platina", "callee">];
   let Args = [IdentifierArgument<"Type">, StringArgument<"PlatinaExpr">];
 
   let Documentation = [Undocumented];
diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h
index 5ab03ecfc4..26b8d18f20 100644
--- a/include/clang/Parse/Parser.h
+++ b/include/clang/Parse/Parser.h
@@ -169,6 +169,7 @@ class Parser : public CodeCompletionHandler {
   std::unique_ptr<PragmaHandler> OptimizeHandler;
   std::unique_ptr<PragmaHandler> LoopboundHandler;
   std::unique_ptr<PragmaHandler> PlatinaGuardHandler;
+  std::unique_ptr<PragmaHandler> PlatinaCalleeHandler;
   std::unique_ptr<PragmaHandler> PlatinHandler;
   std::unique_ptr<PragmaHandler> LoopHintHandler;
   std::unique_ptr<PragmaHandler> UnrollHintHandler;
diff --git a/lib/Parse/ParsePragma.cpp b/lib/Parse/ParsePragma.cpp
index 90ace83078..659a333e1b 100644
--- a/lib/Parse/ParsePragma.cpp
+++ b/lib/Parse/ParsePragma.cpp
@@ -163,6 +163,10 @@ struct PragmaPlatinaGuardHandler : public PragmaPlatinaHandler {
   PragmaPlatinaGuardHandler() : PragmaPlatinaHandler("guard") {}
 };
 
+struct PragmaPlatinaCalleeHandler : public PragmaPlatinaHandler {
+  PragmaPlatinaCalleeHandler() : PragmaPlatinaHandler("callee") {}
+};
+
 struct PragmaPlatinHandler : public PragmaHandler {
   PragmaPlatinHandler() : PragmaHandler("platin") { }
   void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,
@@ -264,6 +268,9 @@ void Parser::initializePragmaHandlers() {
   PlatinaGuardHandler.reset(new PragmaPlatinaGuardHandler());
   PP.AddPragmaHandler("platina", PlatinaGuardHandler.get());
 
+  PlatinaCalleeHandler.reset(new PragmaPlatinaCalleeHandler());
+  PP.AddPragmaHandler("platina", PlatinaCalleeHandler.get());
+
   PlatinHandler.reset(new PragmaPlatinHandler());
   PP.AddPragmaHandler(PlatinHandler.get());
 
@@ -347,6 +354,9 @@ void Parser::resetPragmaHandlers() {
   PP.RemovePragmaHandler("platina", PlatinaGuardHandler.get());
   PlatinaGuardHandler.reset();
 
+  PP.RemovePragmaHandler("platina", PlatinaCalleeHandler.get());
+  PlatinaCalleeHandler.reset();
+
   PP.RemovePragmaHandler("clang", LoopHintHandler.get());
   LoopHintHandler.reset();
 
-- 
GitLab