[Openmp-dev] Experimental SPIR-V back-end using OpenCL 2.1

Marcio Machado Pereira via Openmp-dev openmp-dev at lists.llvm.org
Thu Nov 2 06:22:19 PDT 2017


Thanks so much for the feedback Daniel!

In fact, I was not in the correct llvm branch. I changed it to the computer
branch and also I cloned the
https://github.com/thewilsonator/llvm-target-spirv.git into
llvm/lib/target/SPIRV folder. Is that correct? I could not figure out which
is the correct branch for your clang. So I kept the master branch, making
sure that it is updated (via git pull) and I started the build process
again. Now I have the error below. Do I still have sync issues between the
tools? Thanks in advance.

Marcio


[ 78%] Building CXX object
tools/clang/lib/CodeGen/CMakeFiles/clangCodeGen.dir/CGBuiltin.cpp.o
/Users/marcio/clang-spirv/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp:9769:37:
error:
      no member named 'nvvm_wmma_load_a_f16_col_stride' in namespace
      'llvm::Intrinsic'
      IID = isColMajor ? Intrinsic::nvvm_wmma_load_a_f16_col_stride
                         ~~~~~~~~~~~^
/Users/marcio/clang-spirv/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp:9770:37:
error:
      no member named 'nvvm_wmma_load_a_f16_row_stride' in namespace
      'llvm::Intrinsic'
                       : Intrinsic::nvvm_wmma_load_a_f16_row_stride;
                         ~~~~~~~~~~~^
/Users/marcio/clang-spirv/llvm/tools/clang/lib/CodeGen/CGBuiltin.cpp:9774:37:
error:
      no member named 'nvvm_wmma_load_b_f16_col_stride' in namespace
      'llvm::Intrinsic'
      IID = isColMajor ? Intrinsic::nvvm_wmma_load_b_f16_col_stride
                         ~~~~~~~~~~~^
...


On Wed, Nov 1, 2017 at 2:19 PM, Schürmann, Daniel <
daniel.schuermann at campus.tu-berlin.de> wrote:

> Hi Marcio,
>
>
>
> thanks for your interest!
>
> The compilation errors you get seem to result from LLVM and Clang being
> out of sync.
>
> Please stash your changes and
> make sure, you are on the llvm compute branch from thewilsonator,
>
> (make sure, you also cloned the recursive subproject in target/spirv)
>
> remote add and pull/merge upstream.
>
> Do the same with my clang fork.
> Delete your build folder and try again 😊
>
>
>
> If this still doesn’t work, please let me know and I will look tomorrow
> what is wrong.
>
>
>
> Kind regards,
>
> Daniel
>
>
>
> *Von: *Marcio Machado Pereira via Openmp-dev <openmp-dev at lists.llvm.org>
> *Gesendet: *Mittwoch, 1. November 2017 16:20
> *An: *openmp-dev at lists.llvm.org
> *Betreff: *Re: [Openmp-dev] Experimental SPIR-V back-end using OpenCL 2.1
>
>
> Dear Daniel,
>
> 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.
>
> Follow the informations:
>
> ==============================================
> file clang/utils/TableGen/ClangAttrEmitter.cpp
> ==============================================
>
> $ git diff utils/TableGen/ClangAttrEmitter.cpp
> diff --git a/utils/TableGen/ClangAttrEmitter.cpp b/utils/TableGen/
> ClangAttrEmitter.cpp
> index effabcc..39ae476 100644
> --- a/utils/TableGen/ClangAttrEmitter.cpp
> +++ b/utils/TableGen/ClangAttrEmitter.cpp
> @@ -41,6 +41,7 @@
>  #include <vector>
>
>  using namespace llvm;
> +using namespace detail;
>
>  namespace {
>
> @@ -733,20 +734,23 @@ namespace {
>    };
>
>    // Unique the enums, but maintain the original declaration ordering.
> -  std::vector<StringRef>
> -  uniqueEnumsInOrder(const std::vector<StringRef> &enums) {
> -    std::vector<StringRef> uniques;
> -    SmallDenseSet<StringRef, 8> unique_set;
> +  std::vector<std::string>
> +  uniqueEnumsInOrder(const std::vector<std::string> &enums) {
> +    std::vector<std::string> uniques;
> +    std::set<std::string> unique_set(enums.begin(), enums.end());
>      for (const auto &i : enums) {
> -      if (unique_set.insert(i).second)
> +      std::set<std::string>::iterator set_i = unique_set.find(i);
> +      if (set_i != unique_set.end()) {
>          uniques.push_back(i);
> +        unique_set.erase(set_i);
> +      }
>      }
>      return uniques;
>    }
>
>    class EnumArgument : public Argument {
>      std::string type;
> -    std::vector<StringRef> values, enums, uniques;
> +    std::vector<std::string> values, enums, uniques;
>
>    public:
>      EnumArgument(const Record &Arg, StringRef Attr)
> @@ -866,7 +870,7 @@ namespace {
>
>    class VariadicEnumArgument: public VariadicArgument {
>      std::string type, QualifiedTypeName;
> -    std::vector<StringRef> values, enums, uniques;
> +    std::vector<std::string> values, enums, uniques;
>
>    protected:
>      void writeValueImpl(raw_ostream &OS) const override {
> @@ -2624,7 +2628,7 @@ void EmitClangAttrPCHWrite(RecordKeeper &Records,
> raw_ostream &OS) {
>  // append a unique suffix to distinguish this set of target checks from
> other
>  // TargetSpecificAttr records.
>  static void GenerateTargetSpecificAttrChecks(const Record *R,
> -                                             std::vector<StringRef>
> &Arches,
> +                                             std::vector<std::string>
> &Arches,
>                                               std::string &Test,
>                                               std::string *FnName) {
>    // It is assumed that there will be an llvm::Triple object
> @@ -2649,9 +2653,9 @@ static void GenerateTargetSpecificAttrChecks(const
> Record *R,
>      // We know that there was at least one arch test, so we need to and
> in the
>      // OS tests.
>      Test += " && (";
> -    std::vector<StringRef> OSes = R->getValueAsListOfStrings("OSes");
> +    std::vector<std::string> OSes = R->getValueAsListOfStrings("OSes");
>      for (auto I = OSes.begin(), E = OSes.end(); I != E; ++I) {
> -      StringRef Part = *I;
> +      std::string Part = *I;
>
>        Test += "T.getOS() == llvm::Triple::";
>        Test += Part;
> @@ -2666,9 +2670,9 @@ static void GenerateTargetSpecificAttrChecks(const
> Record *R,
>    // If one or more CXX ABIs are specified, check those as well.
>    if (!R->isValueUnset("CXXABIs")) {
>      Test += " && (";
> -    std::vector<StringRef> CXXABIs = R->getValueAsListOfStrings("
> CXXABIs");
> +    std::vector<std::string> CXXABIs = R->getValueAsListOfStrings("
> CXXABIs");
>      for (auto I = CXXABIs.begin(), E = CXXABIs.end(); I != E; ++I) {
> -      StringRef Part = *I;
> +      std::string Part = *I;
>        Test += "Target.getCXXABI().getKind() == TargetCXXABI::";
>        Test += Part;
>        if (I + 1 != E)
> @@ -2708,7 +2712,7 @@ static void GenerateHasAttrSpellingStringSwitch(
>      std::string Test;
>      if (Attr->isSubClassOf("TargetSpecificAttr")) {
>        const Record *R = Attr->getValueAsDef("Target");
> -      std::vector<StringRef> Arches = R->getValueAsListOfStrings("
> Arches");
> +      std::vector<std::string> Arches = R->getValueAsListOfStrings("
> Arches");
>        GenerateTargetSpecificAttrChecks(R, Arches, Test, nullptr);
>
>        // If this is the C++11 variety, also add in the LangOpts test.
> @@ -3360,7 +3364,7 @@ static std::string GenerateTargetRequirements(const
> Record &Attr,
>
>    // Get the list of architectures to be tested for.
>    const Record *R = Attr.getValueAsDef("Target");
> -  std::vector<StringRef> Arches = R->getValueAsListOfStrings("Arches");
> +  std::vector<std::string> Arches = R->getValueAsListOfStrings("Arches");
>    if (Arches.empty()) {
>      PrintError(Attr.getLoc(), "Empty list of target architectures for a "
>                                "target-specific attr");
> @@ -3377,7 +3381,7 @@ static std::string GenerateTargetRequirements(const
> Record &Attr,
>      const StringRef APK = Attr.getValueAsString("ParseKind");
>      for (const auto &I : Dupes) {
>        if (I.first == APK) {
> -        std::vector<StringRef> DA =
> +        std::vector<std::string> DA =
>              I.second->getValueAsDef("Target")->getValueAsListOfStrings(
>                  "Arches");
>          Arches.insert(Arches.end(), DA.begin(), DA.end());
> @@ -3899,20 +3903,20 @@ void EmitTestPragmaAttributeSupportedAttributes(RecordKeeper
> &Records,
>      std::vector<Record *> Subjects =
>          SubjectObj->getValueAsListOfDefs("Subjects");
>      OS << " (";
> -    for (const auto &Subject : llvm::enumerate(Subjects)) {
> -      if (Subject.index())
> +    for (auto Subject : enumerate(Subjects)) {
> +      if (Subject.Index)
>          OS << ", ";
>        PragmaClangAttributeSupport::RuleOrAggregateRuleSet &RuleSet =
> -          Support.SubjectsToRules.find(Subject.value())->getSecond();
> +          Support.SubjectsToRules.find(Subject.Value)->getSecond();
>        if (RuleSet.isRule()) {
>          OS << RuleSet.getRule().getEnumValueName();
>          continue;
>        }
>        OS << "(";
> -      for (const auto &Rule : llvm::enumerate(RuleSet.getAggregateRuleSet()))
> {
> -        if (Rule.index())
> +      for (auto Rule : enumerate(RuleSet.getAggregateRuleSet())) {
> +        if (Rule.Index)
>            OS << ", ";
> -        OS << Rule.value().getEnumValueName();
> +        OS << Rule.Value.getEnumValueName();
>        }
>        OS << ")";
>      }
>
> =====================================================
> File clang/utils/TableGen/ClangDiagnosticsEmitter.cpp
> =====================================================
>
> $ git diff utils/TableGen/ClangDiagnosticsEmitter.cpp
> diff --git a/utils/TableGen/ClangDiagnosticsEmitter.cpp b/utils/TableGen/
> ClangDiagnosticsEmitter.cpp
> index d9d99e0..32f5317 100644
> --- a/utils/TableGen/ClangDiagnosticsEmitter.cpp
> +++ b/utils/TableGen/ClangDiagnosticsEmitter.cpp
> @@ -1278,7 +1278,7 @@ void EmitClangDiagDocs(RecordKeeper &Records,
> raw_ostream &OS) {
>                       GroupInfo.SubGroups.size() == 1;
>
>      writeHeader(((IsRemarkGroup ? "-R" : "-W") +
> -                    G->getValueAsString("GroupName")).str(),
> +                    G->getValueAsString("GroupName")),
>                  OS);
>
>      if (!IsSynonym) {
>
> ===================================================
> File clang/utils/TableGen/ClangOptionDocEmitter.cpp
> ===================================================
>
> $ git diff utils/TableGen/ClangOptionDocEmitter.cpp
> diff --git a/utils/TableGen/ClangOptionDocEmitter.cpp b/utils/TableGen/
> ClangOptionDocEmitter.cpp
> index 5931451..7e6566c 100644
> --- a/utils/TableGen/ClangOptionDocEmitter.cpp
> +++ b/utils/TableGen/ClangOptionDocEmitter.cpp
> @@ -229,7 +229,7 @@ std::string getRSTStringWithTextFallback(const Record
> *R, StringRef Primary,
>  }
>
>  void emitOptionWithArgs(StringRef Prefix, const Record *Option,
> -                        ArrayRef<StringRef> Args, raw_ostream &OS) {
> +                        ArrayRef<std::string> Args, raw_ostream &OS) {
>    OS << Prefix << escapeRST(Option->getValueAsString("Name"));
>
>    std::pair<StringRef, StringRef> Separators =
> @@ -261,7 +261,7 @@ void emitOptionName(StringRef Prefix, const Record
> *Option, raw_ostream &OS) {
>      }
>    }
>
> -  emitOptionWithArgs(Prefix, Option, std::vector<StringRef>(Args.begin(),
> Args.end()), OS);
> +  emitOptionWithArgs(Prefix, Option, std::vector<std::string>(Args.begin(),
> Args.end()), OS);
>
>    auto AliasArgs = Option->getValueAsListOfStrings("AliasArgs");
>    if (!AliasArgs.empty()) {
> @@ -311,7 +311,7 @@ void emitOption(const DocumentedOption &Option, const
> Record *DocInfo,
>    forEachOptionName(Option, DocInfo, [&](const Record *Option) {
>      for (auto &Prefix : Option->getValueAsListOfStrings("Prefixes"))
>        SphinxOptionIDs.push_back(
> -          getSphinxOptionID((Prefix + Option->getValueAsString("
> Name")).str()));
> +          getSphinxOptionID((Prefix + Option->getValueAsString("
> Name"))));
>    });
>    assert(!SphinxOptionIDs.empty() && "no flags for option");
>    static std::map<std::string, int> NextSuffix;
>
> =================================================
> file llvm/include/llvm/Support/SpecialCaseList.h:
> =================================================
>
> $ git diff include/llvm/Support/SpecialCaseList.h
> diff --git a/include/llvm/Support/SpecialCaseList.h
> b/include/llvm/Support/SpecialCaseList.h
> index ce693c5..dc8532c 100644
> --- a/include/llvm/Support/SpecialCaseList.h
> +++ b/include/llvm/Support/SpecialCaseList.h
> @@ -82,12 +82,14 @@ public:
>    bool inSection(StringRef Section, StringRef Query,
>                   StringRef Category = StringRef()) const;
>
> -private:
> +
> +protected:
>    SpecialCaseList(SpecialCaseList const &) = delete;
>    SpecialCaseList &operator=(SpecialCaseList const &) = delete;
>
>    struct Entry;
> -  StringMap<StringMap<Entry>> Entries;
> +  using SectionEntries = StringMap<StringMap<Entry>>;
> +  SectionEntries Entries;
>    StringMap<StringMap<std::string>> Regexps;
>    bool IsCompiled;
>
>
>
>
> =================
> Last compilation:
> =================
>
> $make
> ...
> Scanning dependencies of target clangBasic
> [ 68%] Building CXX object tools/clang/lib/Basic/
> CMakeFiles/clangBasic.dir/SanitizerBlacklist.cpp.o
> [ 68%] Building CXX object tools/clang/lib/Basic/
> CMakeFiles/clangBasic.dir/SanitizerSpecialCaseList.cpp.o
> /Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/
> SanitizerSpecialCaseList.cpp:23:13: error:
>       no member named 'createInternal' in 'clang::
> SanitizerSpecialCaseList'
>   if (SSCL->createInternal(Paths, Error)) {
>       ~~~~  ^
> /Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/
> SanitizerSpecialCaseList.cpp:39:18: error:
>       use of undeclared identifier 'Sections'; did you mean 'inSection'?
>   for (auto &S : Sections) {
>                  ^~~~~~~~
>                  inSection
> /Users/marcio/clang-spirv/llvm/tools/clang/include/clang/Basic/
> SanitizerSpecialCaseList.h:34:8: note:
>       'inSection' declared here
>   bool inSection(SanitizerMask Mask, StringRef Prefix, StringRef Query,
>        ^
> /Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/
> SanitizerSpecialCaseList.cpp:39:18: error:
>       reference to non-static member function must be called
>   for (auto &S : Sections) {
>                  ^~~~~~~~
> /Users/marcio/clang-spirv/llvm/tools/clang/lib/Basic/
> SanitizerSpecialCaseList.cpp:60:62: error:
>       too many arguments to function call, expected at most 3, have 4
>         SpecialCaseList::inSection(S.Entries, Prefix, Query, Category))
>         ~~~~~~~~~~~~~~~~~~~~~~~~~~                           ^~~~~~~~
> /Users/marcio/clang-spirv/llvm/include/llvm/Support/SpecialCaseList.h:82:3:
> note:
>       'inSection' declared here
>   bool inSection(StringRef Section, StringRef Query,
>   ^
> 4 errors generated.
> make[2]: *** [tools/clang/lib/Basic/CMakeFiles/clangBasic.dir/
> SanitizerSpecialCaseList.cpp.o] Error 1
> make[1]: *** [tools/clang/lib/Basic/CMakeFiles/clangBasic.dir/all] Error 2
> make: *** [all] Error 2
>
>
> $make -j4
> ...
> [ 12%] Updating AttributesCompatFunc.inc...
> [ 12%] Built target AttributeCompatFuncTableGen
> /Users/marcio/clang-spirv/llvm/tools/clang/include/
> clang/Driver/Options.td:514:57: [ 12%] Updating Attributes.gen...
> error: Couldn't find class 'Values'
>   HelpText<"OpenCL language standard to compile for.">,
> Values<"cl,CL,cl1.1,CL1.1,cl1.2,CL1.2,cl2.0,CL2.0">;
>                                                         ^
> make[2]: *** [tools/clang/include/clang/Driver/Options.inc.tmp] Error 1
> make[1]: *** [tools/clang/include/clang/Driver/CMakeFiles/ClangDriverOptions.dir/all]
> Error 2
> make[1]: *** Waiting for unfinished jobs....
> [ 12%] Updating Intrinsics.gen...
> [ 12%] Built target intrinsics_gen
> [ 12%] Built target llvm-mcmarkup
> [ 12%] Built target llvm-cxxfilt
> make: *** [all] Error 2
>
> Cheers,
> Marcio
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/openmp-dev/attachments/20171102/73577593/attachment-0001.html>


More information about the Openmp-dev mailing list