|
17 | 17 | #include "clang/Basic/TargetInfo.h" |
18 | 18 | #include "clang/Basic/TargetOptions.h" |
19 | 19 | #include "llvm/Support/Compiler.h" |
| 20 | +#include "llvm/Support/NVPTXAddrSpace.h" |
20 | 21 | #include "llvm/TargetParser/Triple.h" |
21 | 22 | #include <optional> |
22 | 23 |
|
23 | 24 | namespace clang { |
24 | 25 | namespace targets { |
25 | 26 |
|
26 | 27 | static const unsigned NVPTXAddrSpaceMap[] = { |
27 | | - 0, // Default |
28 | | - 1, // opencl_global |
29 | | - 3, // opencl_local |
30 | | - 4, // opencl_constant |
31 | | - 0, // opencl_private |
32 | | - // FIXME: generic has to be added to the target |
33 | | - 0, // opencl_generic |
34 | | - 1, // opencl_global_device |
35 | | - 1, // opencl_global_host |
36 | | - 1, // cuda_device |
37 | | - 4, // cuda_constant |
38 | | - 3, // cuda_shared |
39 | | - 1, // sycl_global |
40 | | - 1, // sycl_global_device |
41 | | - 1, // sycl_global_host |
42 | | - 3, // sycl_local |
43 | | - 0, // sycl_private |
44 | | - 0, // ptr32_sptr |
45 | | - 0, // ptr32_uptr |
46 | | - 0, // ptr64 |
47 | | - 0, // hlsl_groupshared |
| 28 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // Default |
| 29 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // opencl_global |
| 30 | + llvm::NVPTXAS::ADDRESS_SPACE_SHARED, // opencl_local |
| 31 | + llvm::NVPTXAS::ADDRESS_SPACE_CONST, // opencl_constant |
| 32 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // opencl_private |
| 33 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // opencl_generic |
| 34 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // opencl_global_device |
| 35 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // opencl_global_host |
| 36 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // cuda_device |
| 37 | + llvm::NVPTXAS::ADDRESS_SPACE_CONST, // cuda_constant |
| 38 | + llvm::NVPTXAS::ADDRESS_SPACE_SHARED, // cuda_shared |
| 39 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // sycl_global |
| 40 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // sycl_global_device |
| 41 | + llvm::NVPTXAS::ADDRESS_SPACE_GLOBAL, // sycl_global_host |
| 42 | + llvm::NVPTXAS::ADDRESS_SPACE_SHARED, // sycl_local |
| 43 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // sycl_private |
| 44 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // ptr32_sptr |
| 45 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // ptr32_uptr |
| 46 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // ptr64 |
| 47 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC, // hlsl_groupshared |
48 | 48 | // Wasm address space values for this target are dummy values, |
49 | 49 | // as it is only enabled for Wasm targets. |
50 | 50 | 20, // wasm_funcref |
@@ -89,6 +89,21 @@ class LLVM_LIBRARY_VISIBILITY NVPTXTargetInfo : public TargetInfo { |
89 | 89 |
|
90 | 90 | bool hasFeature(StringRef Feature) const override; |
91 | 91 |
|
| 92 | + virtual bool isAddressSpaceSupersetOf(LangAS A, LangAS B) const override { |
| 93 | + // The generic address space AS(0) is a superset of all the other address |
| 94 | + // spaces used by the backend target. |
| 95 | + return A == B || |
| 96 | + (A == LangAS::Default || |
| 97 | + (isTargetAddressSpace(A) && |
| 98 | + toTargetAddressSpace(A) == |
| 99 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC)) && |
| 100 | + isTargetAddressSpace(B) && |
| 101 | + toTargetAddressSpace(B) >= |
| 102 | + llvm::NVPTXAS::ADDRESS_SPACE_GENERIC && |
| 103 | + isTargetAddressSpace(B) && |
| 104 | + toTargetAddressSpace(B) <= llvm::NVPTXAS::ADDRESS_SPACE_LOCAL; |
| 105 | + } |
| 106 | + |
92 | 107 | ArrayRef<const char *> getGCCRegNames() const override; |
93 | 108 |
|
94 | 109 | ArrayRef<TargetInfo::GCCRegAlias> getGCCRegAliases() const override { |
|
0 commit comments