<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Mon, Jun 15, 2015 at 9:30 AM, Samuel Antao <span dir="ltr"><<a href="mailto:sfantao@us.ibm.com" target="_blank">sfantao@us.ibm.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi ABataev, hfinkel, rsmith,<br>
<br>
According to the OpenMP spec, all the preprocessor macros should be expanded in OpenMP pragmas. This patch adds support for that.<br></blockquote><div><br></div><div>We already have support for that :) I assume you mean this patch adds support for that *to -E*.</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_D10446&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=CFJcYUbN-Y4vXf1qegdDm9T1iur80jIutlgIkiQhpn4&s=v6lrb01Xac2S6VSEn-O1u-Cn6hreCQec1dXkrBthiyk&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/D10446</a><br>
<br>
Files:<br>
  lib/Frontend/PrintPreprocessedOutput.cpp<br>
  test/OpenMP/preprocessor.c<br>
<br>
Index: lib/Frontend/PrintPreprocessedOutput.cpp<br>
===================================================================<br>
--- lib/Frontend/PrintPreprocessedOutput.cpp<br>
+++ lib/Frontend/PrintPreprocessedOutput.cpp<br>
@@ -588,6 +588,37 @@<br>
     Callbacks->setEmittedDirectiveOnThisLine();<br>
   }<br>
 };<br>
+struct OMPPragmaHandler : public PragmaHandler {<br>
+  const char *Prefix;<br>
+  PrintPPOutputPPCallbacks *Callbacks;<br>
+<br>
+  OMPPragmaHandler(const char *prefix, PrintPPOutputPPCallbacks *callbacks)<br>
+      : Prefix(prefix), Callbacks(callbacks) {}<br>
+  void HandlePragma(Preprocessor &PP, PragmaIntroducerKind Introducer,<br>
+                    Token &PragmaTok) override {<br>
+<br>
+    // The tokens after pragma omp need to be expanded.<br>
+    //<br>
+    //  OpenMP [2.1, Directive format]<br>
+    //  Preprocessing tokens following the #pragma omp are subject to macro<br>
+    //  replacement.<br>
+<br>
+    // Figure out what line we went to and insert the appropriate number of<br>
+    // newline characters.<br>
+    Callbacks->startNewLineIfNeeded();<br>
+    Callbacks->MoveToLine(PragmaTok.getLocation());<br>
+    Callbacks->OS.write(Prefix, strlen(Prefix));<br>
+    // Read and print all of the pragma tokens.<br>
+    while (PragmaTok.isNot(tok::eod)) {<br>
+      if (PragmaTok.hasLeadingSpace())<br>
+        Callbacks->OS << ' ';<br></blockquote><div><br></div><div>Since you're doing macro expansion here, there are other ways in which you can need a leading space before a token; you should also insert a space if Callbacks->AvoidConcat says you need one (this is a pre-existing bug in the UnknownPragmaHandler).</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+      std::string TokSpell = PP.getSpelling(PragmaTok);<br>
+      Callbacks->OS.write(&TokSpell[0], TokSpell.size());<br>
+      PP.Lex(PragmaTok);<br>
+    }<br>
+    Callbacks->setEmittedDirectiveOnThisLine();<br>
+  }<br>
+};<br>
 } // end anonymous namespace<br>
<br>
<br>
@@ -722,6 +753,7 @@<br>
   PP.AddPragmaHandler("GCC", new UnknownPragmaHandler("#pragma GCC",Callbacks));<br>
   PP.AddPragmaHandler("clang",<br>
                       new UnknownPragmaHandler("#pragma clang", Callbacks));<br>
+  PP.AddPragmaHandler("omp", new OMPPragmaHandler("#pragma omp", Callbacks));<br></blockquote><div><br></div><div>Instead of adding a new kind of PragmaHandler here, let's generalize the existing infrastructure: please add a bool flag to UnknownPragmaHandler that says whether to expand macros, set it to 'true' for omp and to getLangOpts().MicrosoftExt for the other cases. (Using MicrosoftExt here isn't right, but it matches our current behavior and we can correct it in a later change.)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   PP.addPPCallbacks(std::unique_ptr<PPCallbacks>(Callbacks));<br>
<br>
Index: test/OpenMP/preprocessor.c<br>
===================================================================<br>
--- /dev/null<br>
+++ test/OpenMP/preprocessor.c<br>
@@ -0,0 +1,30 @@<br>
+// RUN:   %clang -fopenmp -E -o - %s 2>&1 | FileCheck %s<br></blockquote><div><br></div><div>This should be a %clang_cc1 test, and should go in test/Preprocessor.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+<br>
+// This is to make sure the pragma name is not expanded!<br>
+#define omp (0xDEADBEEF)<br>
+<br>
+#define N 2<br>
+#define M 1<br>
+<br>
+#define map_to_be_expanded(x) map(tofrom:x)<br>
+#define sched_to_be_expanded(x) schedule(x,N)<br>
+#define reda_to_be_expanded(x) reduction(+:x)<br>
+#define redb_to_be_expanded(x,op) reduction(op:x)<br>
+<br>
+void foo(int *a, int *b) {<br>
+  //CHECK: omp target map(a[0:2]) map(tofrom:b[0:2*1])<br>
+  #pragma omp target map(a[0:N]) map_to_be_expanded(b[0:2*M])<br>
+  {<br>
+    int reda;<br>
+    int redb;<br>
+    //CHECK: omp parallel for schedule(static,2) reduction(+:reda) reduction(*:redb)<br>
+    #pragma omp parallel for sched_to_be_expanded(static) \<br>
+        reda_to_be_expanded(reda) redb_to_be_expanded(redb,*)<br>
+    for (int i = 0; i < N; ++i) {<br>
+      reda += a[i];<br>
+      redb += b[i];<br>
+    }<br>
+    a[0] = reda;<br>
+    b[0] = redb;<br>
+  }<br>
+}<br>
<br>
EMAIL PREFERENCES<br>
  <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__reviews.llvm.org_settings_panel_emailpreferences_&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=BSqEv9KvKMW_Ob8SyngJ70KdZISM_ASROnREeq0cCxk&m=CFJcYUbN-Y4vXf1qegdDm9T1iur80jIutlgIkiQhpn4&s=2HCJsqTMzVLWq4dUqRjerBv5nQnkNoOrCwZTRGZ8Z3c&e=" rel="noreferrer" target="_blank">http://reviews.llvm.org/settings/panel/emailpreferences/</a><br>
</blockquote></div><br></div></div>