================ @@ -8,12 +8,74 @@ #include "llvm/Frontend/OpenMP/OMP.h" +#include "llvm/ADT/ArrayRef.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringRef.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Support/ErrorHandling.h" +#include <algorithm> +#include <iterator> +#include <type_traits> + using namespace llvm; -using namespace omp; +using namespace llvm::omp; #define GEN_DIRECTIVES_IMPL #include "llvm/Frontend/OpenMP/OMP.inc" + +namespace llvm::omp { +ArrayRef<Directive> getLeafConstructs(Directive D) { + auto Idx = static_cast<int>(D); + if (Idx < 0 || Idx >= static_cast<int>(Directive_enumSize)) + return {}; + const auto *Row = LeafConstructTable[LeafConstructTableOrdering[Idx]]; + return ArrayRef(&Row[2], &Row[2] + static_cast<int>(Row[1])); +} + +Directive getCompoundConstruct(ArrayRef<Directive> Parts) { + if (Parts.empty()) + return OMPD_unknown; + + // Parts don't have to be leafs, so expand them into leafs first. + // Store the expanded leafs in the same format as rows in the leaf + // table (generated by tablegen). + SmallVector<Directive> RawLeafs(2); + for (Directive P : Parts) { + ArrayRef<Directive> Ls = getLeafConstructs(P); + if (!Ls.empty()) + RawLeafs.append(Ls.begin(), Ls.end()); + else + RawLeafs.push_back(P); + } + + auto GivenLeafs{ArrayRef<Directive>(RawLeafs).drop_front(2)}; ---------------- kparzysz wrote:
Done https://github.com/llvm/llvm-project/pull/87247 _______________________________________________ llvm-branch-commits mailing list llvm-branch-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits