<div dir="ltr"><div><div>Dear Daniel,<br><br>I was very interested in getting to know your work. I realized that a visual inspection is not enough, so I decided to build the tools to inspect how you are generating code for spir-v. I downloaded clang, llvm and openmp indicated by you in the email and start the build process. It happened that in this process I encountered a series of inconsistencies, and differences in functions signature, etc. I tried to solve them by modifying some of the files I set out below. This allowed me to continue a little, but as the changes started to require more meaningful changes, I decided to write to you counting with your help. I'm sorry if the email is large but I tried to describe the problems and solution alternatives I used. To facilitate your analysis, I used the git diff tool that explains my modifications. At the end of the text, I put the final result of the make process in two situations (for 1 thread and 4 threads). I would greatly appreciate feedback from you to complete this build process. <br><br>Follow the informations:<br><br>==============================================<br>file clang/utils/TableGen/ClangAttrEmitter.cpp<br>==============================================<br><br>$ git diff utils/TableGen/ClangAttrEmitter.cpp<br>diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/ClangAttrEmitter.cpp<br>index effabcc..39ae476 100644<br>--- a/utils/TableGen/ClangAttrEmitter.cpp<br>+++ b/utils/TableGen/ClangAttrEmitter.cpp<br>@@ -41,6 +41,7 @@<br> #include <vector><br><br> using namespace llvm;<br>+using namespace detail;<br><br> namespace {<br><br>@@ -733,20 +734,23 @@ namespace {<br>   };<br><br>   // Unique the enums, but maintain the original declaration ordering.<br>-  std::vector<StringRef><br>-  uniqueEnumsInOrder(const std::vector<StringRef> &enums) {<br>-    std::vector<StringRef> uniques;<br>-    SmallDenseSet<StringRef, 8> unique_set;<br>+  std::vector<std::string><br>+  uniqueEnumsInOrder(const std::vector<std::string> &enums) {<br>+    std::vector<std::string> uniques;<br>+    std::set<std::string> unique_set(enums.begin(), enums.end());<br>     for (const auto &i : enums) {<br>-      if (unique_set.insert(i).second)<br>+      std::set<std::string>::iterator set_i = unique_set.find(i);<br>+      if (set_i != unique_set.end()) {<br>         uniques.push_back(i);<br>+        unique_set.erase(set_i);<br>+      }<br>     }<br>     return uniques;<br>   }<br><br>   class EnumArgument : public Argument {<br>     std::string type;<br>-    std::vector<StringRef> values, enums, uniques;<br>+    std::vector<std::string> values, enums, uniques;<br><br>   public:<br>     EnumArgument(const Record &Arg, StringRef Attr)<br>@@ -866,7 +870,7 @@ namespace {<br><br>   class VariadicEnumArgument: public VariadicArgument {<br>     std::string type, QualifiedTypeName;<br>-    std::vector<StringRef> values, enums, uniques;<br>+    std::vector<std::string> values, enums, uniques;<br><br>   protected:<br>     void writeValueImpl(raw_ostream &OS) const override {<br>@@ -2624,7 +2628,7 @@ void EmitClangAttrPCHWrite(RecordKeeper &Records, raw_ostream &OS) {<br> // append a unique suffix to distinguish this set of target checks from other<br> // TargetSpecificAttr records.<br> static void GenerateTargetSpecificAttrChecks(const Record *R,<br>-                                             std::vector<StringRef> &Arches,<br>+                                             std::vector<std::string> &Arches,<br>                                              std::string &Test,<br>                                              std::string *FnName) {<br>   // It is assumed that there will be an llvm::Triple object<br>@@ -2649,9 +2653,9 @@ static void GenerateTargetSpecificAttrChecks(const Record *R,<br>     // We know that there was at least one arch test, so we need to and in the<br>     // OS tests.<br>     Test += " && (";<br>-    std::vector<StringRef> OSes = R->getValueAsListOfStrings("OSes");<br>+    std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes");<br>     for (auto I = OSes.begin(), E = OSes.end(); I != E; ++I) {<br>-      StringRef Part = *I;<br>+      std::string Part = *I;<br><br>       Test += "T.getOS() == llvm::Triple::";<br>       Test += Part;<br>@@ -2666,9 +2670,9 @@ static void GenerateTargetSpecificAttrChecks(const Record *R,<br>   // If one or more CXX ABIs are specified, check those as well.<br>   if (!R->isValueUnset("CXXABIs")) {<br>     Test += " && (";<br>-    std::vector<StringRef> CXXABIs = R->getValueAsListOfStrings("CXXABIs");<br>+    std::vector<std::string> CXXABIs = R->getValueAsListOfStrings("CXXABIs");<br>     for (auto I = CXXABIs.begin(), E = CXXABIs.end(); I != E; ++I) {<br>-      StringRef Part = *I;<br>+      std::string Part = *I;<br>       Test += "Target.getCXXABI().getKind() == TargetCXXABI::";<br>       Test += Part;<br>       if (I + 1 != E)<br>@@ -2708,7 +2712,7 @@ static void GenerateHasAttrSpellingStringSwitch(<br>     std::string Test;<br>     if (Attr->isSubClassOf("TargetSpecificAttr")) {<br>       const Record *R = Attr->getValueAsDef("Target");<br>-      std::vector<StringRef> Arches = R->getValueAsListOfStrings("Arches");<br>+      std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");<br>       GenerateTargetSpecificAttrChecks(R, Arches, Test, nullptr);<br><br>       // If this is the C++11 variety, also add in the LangOpts test.<br>@@ -3360,7 +3364,7 @@ static std::string GenerateTargetRequirements(const Record &Attr,<br><br>   // Get the list of architectures to be tested for.<br>   const Record *R = Attr.getValueAsDef("Target");<br>-  std::vector<StringRef> Arches = R->getValueAsListOfStrings("Arches");<br>+  std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");<br>   if (Arches.empty()) {<br>     PrintError(Attr.getLoc(), "Empty list of target architectures for a "<br>                               "target-specific attr");<br>@@ -3377,7 +3381,7 @@ static std::string GenerateTargetRequirements(const Record &Attr,<br>     const StringRef APK = Attr.getValueAsString("ParseKind");<br>     for (const auto &I : Dupes) {<br>       if (I.first == APK) {<br>-        std::vector<StringRef> DA =<br>+        std::vector<std::string> DA =<br>             I.second->getValueAsDef("Target")->getValueAsListOfStrings(<br>                 "Arches");<br>         Arches.insert(Arches.end(), DA.begin(), DA.end());<br>@@ -3899,20 +3903,20 @@ void EmitTestPragmaAttributeSupportedAttributes(RecordKeeper &Records,<br>     std::vector<Record *> Subjects =<br>         SubjectObj->getValueAsListOfDefs("Subjects");<br>     OS << " (";<br>-    for (const auto &Subject : llvm::enumerate(Subjects)) {<br>-      if (Subject.index())<br>+    for (auto Subject : enumerate(Subjects)) {<br>+      if (Subject.Index)<br>         OS << ", ";<br>       PragmaClangAttributeSupport::RuleOrAggregateRuleSet &RuleSet =<br>-          Support.SubjectsToRules.find(Subject.value())->getSecond();<br>+          Support.SubjectsToRules.find(Subject.Value)->getSecond();<br>       if (RuleSet.isRule()) {<br>         OS << RuleSet.getRule().getEnumValueName();<br>         continue;<br>       }<br>       OS << "(";<br>-      for (const auto &Rule : llvm::enumerate(RuleSet.getAggregateRuleSet())) {<br>-        if (Rule.index())<br>+      for (auto Rule : enumerate(RuleSet.getAggregateRuleSet())) {<br>+        if (Rule.Index)<br>           OS << ", ";<br>-        OS << Rule.value().getEnumValueName();<br>+        OS << Rule.Value.getEnumValueName();<br>       }<br>       OS << ")";<br>     }<br><br>=====================================================<br>File clang/utils/TableGen/ClangDiagnosticsEmitter.cpp<br>=====================================================<br><br>$ git diff utils/TableGen/ClangDiagnosticsEmitter.cpp<br>diff --git a/utils/TableGen/ClangDiagnosticsEmitter.cpp b/utils/TableGen/ClangDiagnosticsEmitter.cpp<br>index d9d99e0..32f5317 100644<br>--- a/utils/TableGen/ClangDiagnosticsEmitter.cpp<br>+++ b/utils/TableGen/ClangDiagnosticsEmitter.cpp<br>@@ -1278,7 +1278,7 @@ void EmitClangDiagDocs(RecordKeeper &Records, raw_ostream &OS) {<br>                      GroupInfo.SubGroups.size() == 1;<br><br>     writeHeader(((IsRemarkGroup ? "-R" : "-W") +<br>-                    G->getValueAsString("GroupName")).str(),<br>+                    G->getValueAsString("GroupName")),<br>                 OS);<br><br>     if (!IsSynonym) {<br><br>===================================================<br>File clang/utils/TableGen/ClangOptionDocEmitter.cpp<br>===================================================<br><br>$ git diff utils/TableGen/ClangOptionDocEmitter.cpp<br>diff --git a/utils/TableGen/ClangOptionDocEmitter.cpp b/utils/TableGen/ClangOptionDocEmitter.cpp<br>index 5931451..7e6566c 100644<br>--- a/utils/TableGen/ClangOptionDocEmitter.cpp<br>+++ b/utils/TableGen/ClangOptionDocEmitter.cpp<br>@@ -229,7 +229,7 @@ std::string getRSTStringWithTextFallback(const Record *R, StringRef Primary,<br> }<br><br> void emitOptionWithArgs(StringRef Prefix, const Record *Option,<br>-                        ArrayRef<StringRef> Args, raw_ostream &OS) {<br>+                        ArrayRef<std::string> Args, raw_ostream &OS) {<br>   OS << Prefix << escapeRST(Option->getValueAsString("Name"));<br><br>   std::pair<StringRef, StringRef> Separators =<br>@@ -261,7 +261,7 @@ void emitOptionName(StringRef Prefix, const Record *Option, raw_ostream &OS) {<br>     }<br>   }<br><br>-  emitOptionWithArgs(Prefix, Option, std::vector<StringRef>(Args.begin(), Args.end()), OS);<br>+  emitOptionWithArgs(Prefix, Option, std::vector<std::string>(Args.begin(), Args.end()), OS);<br><br>   auto AliasArgs = Option->getValueAsListOfStrings("AliasArgs");<br>   if (!AliasArgs.empty()) {<br>@@ -311,7 +311,7 @@ void emitOption(const DocumentedOption &Option, const Record *DocInfo,<br>   forEachOptionName(Option, DocInfo, [&](const Record *Option) {<br>     for (auto &Prefix : Option->getValueAsListOfStrings("Prefixes"))<br>       SphinxOptionIDs.push_back(<br>-          getSphinxOptionID((Prefix + Option->getValueAsString("Name")).str()));<br>+          getSphinxOptionID((Prefix + Option->getValueAsString("Name"))));<br>   });<br>   assert(!SphinxOptionIDs.empty() && "no flags for option");<br>   static std::map<std::string, int> NextSuffix;<br><br>=================================================<br>file llvm/include/llvm/Support/SpecialCaseList.h:<br>=================================================<br><br>$ git diff include/llvm/Support/SpecialCaseList.h<br>diff --git a/include/llvm/Support/SpecialCaseList.h b/include/llvm/Support/SpecialCaseList.h<br>index ce693c5..dc8532c 100644<br>--- a/include/llvm/Support/SpecialCaseList.h<br>+++ b/include/llvm/Support/SpecialCaseList.h<br>@@ -82,12 +82,14 @@ public:<br>   bool inSection(StringRef Section, StringRef Query,<br>                  StringRef Category = StringRef()) const;<br><br>-private:<br>+<br>+protected:<br>   SpecialCaseList(SpecialCaseList const &) = delete;<br>   SpecialCaseList &operator=(SpecialCaseList const &) = delete;<br><br>   struct Entry;<br>-  StringMap<StringMap<Entry>> Entries;<br>+  using SectionEntries = StringMap<StringMap<Entry>>;<br>+  SectionEntries Entries;<br>   StringMap<StringMap<std::string>> Regexps;<br>   bool IsCompiled;<br><br><br><br><br>=================<br>Last compilation:<br>=================<br><br>$make<br>...<br>Scanning dependencies of target clangBasic<br>[ 68%] Building CXX object tools/clang/lib/Basic/CMakeFiles/clangBasic.dir/SanitizerBlacklist.cpp.o<br>[ 68%] Building CXX object tools/clang/lib/Basic/CMakeFiles/clangBasic.dir/SanitizerSpecialCaseList.cpp.o<br>/Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/SanitizerSpecialCaseList.cpp:23:13: error:<br>      no member named 'createInternal' in 'clang::SanitizerSpecialCaseList'<br>  if (SSCL->createInternal(Paths, Error)) {<br>      ~~~~  ^<br>/Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/SanitizerSpecialCaseList.cpp:39:18: error:<br>      use of undeclared identifier 'Sections'; did you mean 'inSection'?<br>  for (auto &S : Sections) {<br>                 ^~~~~~~~<br>                 inSection<br>/Users/marcio/clang-spirv/llvm/tools/clang/include/clang/Basic/SanitizerSpecialCaseList.h:34:8: note:<br>      'inSection' declared here<br>  bool inSection(SanitizerMask Mask, StringRef Prefix, StringRef Query,<br>       ^<br>/Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/SanitizerSpecialCaseList.cpp:39:18: error:<br>      reference to non-static member function must be called<br>  for (auto &S : Sections) {<br>                 ^~~~~~~~<br>/Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/SanitizerSpecialCaseList.cpp:60:62: error:<br>      too many arguments to function call, expected at most 3, have 4<br>        SpecialCaseList::inSection(S.Entries, Prefix, Query, Category))<br>        ~~~~~~~~~~~~~~~~~~~~~~~~~~                           ^~~~~~~~<br>/Users/marcio/clang-spirv/llvm/include/llvm/Support/SpecialCaseList.h:82:3: note:<br>      'inSection' declared here<br>  bool inSection(StringRef Section, StringRef Query,<br>  ^<br>4 errors generated.<br>make[2]: *** [tools/clang/lib/Basic/CMakeFiles/clangBasic.dir/SanitizerSpecialCaseList.cpp.o] Error 1<br>make[1]: *** [tools/clang/lib/Basic/CMakeFiles/clangBasic.dir/all] Error 2<br>make: *** [all] Error 2<br><br><br>$make -j4<br>...<br>[ 12%] Updating AttributesCompatFunc.inc...<br>[ 12%] Built target AttributeCompatFuncTableGen<br>/Users/marcio/clang-spirv/llvm/tools/clang/include/clang/Driver/Options.td:514:57: [ 12%] Updating Attributes.gen...<br>error: Couldn't find class 'Values'<br>  HelpText<"OpenCL language standard to compile for.">, Values<"cl,CL,cl1.1,CL1.1,cl1.2,CL1.2,cl2.0,CL2.0">;<br>                                                        ^<br>make[2]: *** [tools/clang/include/clang/Driver/Options.inc.tmp] Error 1<br>make[1]: *** [tools/clang/include/clang/Driver/CMakeFiles/ClangDriverOptions.dir/all] Error 2<br>make[1]: *** Waiting for unfinished jobs....<br>[ 12%] Updating Intrinsics.gen...<br>[ 12%] Built target intrinsics_gen<br>[ 12%] Built target llvm-mcmarkup<br>[ 12%] Built target llvm-cxxfilt<br>make: *** [all] Error 2<br><br></div>Cheers,<br></div>Marcio<br><br><div><div><br><br></div></div></div>