[Openmp-dev] Experimental SPIR-V back-end using OpenCL 2.1
Daniel Schürmann via Openmp-dev
openmp-dev at lists.llvm.org
Thu Nov 2 09:09:43 PDT 2017
Seems like your clang and llvm still don't fit together.
However, I rebased my clang fork, so please just force pull. The master
branch is correct.
Or you can try these instructions:
git clone --recursive git at github.com:thewilsonator/llvm.git
git checkout compute
git remote add upstream git at github.com:llvm-mirror/llvm.git
git pull upstream master
cd tools
git clone git at github.com:daniel-schuermann/clang.git
(not necessary at the moment, but might be from time to time:
git remote add upstream git at github.com:llvm-mirror/clang.git
git pull upstream master
)
Hope that works for you!
Kind regards,
Daniel
On 11/02/2017 02:22 PM, Marcio Machado Pereira wrote:
> 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
> <mailto: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
> <mailto:openmp-dev at lists.llvm.org>
> *Gesendet: *Mittwoch, 1. November 2017 16:20
> *An: *openmp-dev at lists.llvm.org <mailto: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/07e2c0f5/attachment-0001.html>
More information about the Openmp-dev
mailing list