Skip to content

Commit 180cef8

Browse files
authored
Merge pull request #168 from Pennycook/compiler-definitions
Add compiler definitions
2 parents 3be870a + 235a4ba commit 180cef8

File tree

6 files changed

+219
-1
lines changed

6 files changed

+219
-1
lines changed

MANIFEST.in

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
include codebasin/compilers/clang.toml
2+
include codebasin/compilers/gnu.toml
3+
include codebasin/compilers/intel.toml
4+
include codebasin/compilers/nvidia.toml
15
include codebasin/schema/analysis.schema
26
include codebasin/schema/compilation-database.schema
37
include codebasin/schema/coverage.schema

codebasin/compilers/clang.toml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
[compiler.clang]
2+
3+
[compiler."clang++"]
4+
alias_of = "clang"
5+
6+
[[compiler.clang.parser]]
7+
flags = ["-fopenmp"]
8+
action = "append_const"
9+
dest = "modes"
10+
const = "openmp"
11+
12+
[[compiler.clang.parser]]
13+
flags = ["-fsycl-is-device"]
14+
action = "append_const"
15+
dest = "defines"
16+
const = "__SYCL_DEVICE_ONLY__"
17+
18+
[[compiler.clang.modes]]
19+
name = "openmp"
20+
defines = ["_OPENMP"]

codebasin/compilers/gnu.toml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
[compiler.gcc]
2+
3+
[compiler."g++"]
4+
alias_of = "gcc"
5+
6+
[[compiler.gcc.parser]]
7+
flags = ["-fopenmp"]
8+
action = "append_const"
9+
dest = "modes"
10+
const = "openmp"
11+
12+
[[compiler.gcc.modes]]
13+
name = "openmp"
14+
defines = ["_OPENMP"]

codebasin/compilers/intel.toml

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
[compiler.icx]
2+
3+
[compiler.icpx]
4+
alias_of = "icx"
5+
6+
[[compiler.icx.parser]]
7+
flags = ["-fopenmp"]
8+
action = "append_const"
9+
dest = "modes"
10+
const = "openmp"
11+
12+
[[compiler.icx.parser]]
13+
flags = ["-fsycl"]
14+
action = "append_const"
15+
dest = "modes"
16+
const = "sycl"
17+
18+
[[compiler.icx.parser]]
19+
flags = ["-fsycl-targets"]
20+
action = "store_split"
21+
sep = ","
22+
format = "sycl-$value"
23+
dest = "passes"
24+
default = ["sycl-spir64"]
25+
26+
[[compiler.icx.modes]]
27+
name = "sycl"
28+
defines = ["SYCL_LANGUAGE_VERSION"]
29+
30+
[[compiler.icx.modes]]
31+
name = "openmp"
32+
defines = ["_OPENMP"]
33+
34+
[[compiler.icx.passes]]
35+
name = "sycl-spir64"
36+
defines = ["__SYCL_DEVICE_ONLY__", "__SPIR__", "__SPIRV__"]
37+
modes = ["sycl"]
38+
39+
[[compiler.icx.passes]]
40+
name = "sycl-spir64_x86_64"
41+
defines = ["__SYCL_DEVICE_ONLY__", "__SPIR__", "__SPIRV__"]
42+
modes = ["sycl"]
43+
44+
[[compiler.icx.passes]]
45+
name = "sycl-spir64_gen"
46+
defines = ["__SYCL_DEVICE_ONLY__", "__SPIR__", "__SPIRV__"]
47+
modes = ["sycl"]
48+
49+
[[compiler.icx.passes]]
50+
name = "sycl-spir64_fpga"
51+
defines = ["__SYCL_DEVICE_ONLY__", "__SPIR__", "__SPIRV__"]
52+
modes = ["sycl"]

codebasin/compilers/nvidia.toml

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
[compiler.nvcc]
2+
options = ["-D__NVCC__", "-D__CUDACC__"]
3+
4+
[[compiler.nvcc.parser]]
5+
flags = ["-fopenmp"]
6+
action = "append_const"
7+
dest = "modes"
8+
const = "openmp"
9+
10+
[[compiler.nvcc.parser]]
11+
flags = ["--gpu-architecture", "--gpu-code", "-gencode"]
12+
action = "extend_match"
13+
pattern = '(?:sm_|compute_)(\d+)'
14+
format = "sm_$value"
15+
dest = "passes"
16+
default = ["sm_70"]
17+
override = true
18+
19+
[[compiler.nvcc.modes]]
20+
name = "openmp"
21+
defines = ["_OPENMP"]
22+
23+
[[compiler.nvcc.passes]]
24+
name = "sm_70"
25+
defines = ["__CUDA_ARCH__=700"]
26+
27+
[[compiler.nvcc.passes]]
28+
name = "sm_75"
29+
defines = ["__CUDA_ARCH__=750"]
30+
31+
[[compiler.nvcc.passes]]
32+
name = "sm_80"
33+
defines = ["__CUDA_ARCH__=800"]
34+
35+
[[compiler.nvcc.passes]]
36+
name = "sm_89"
37+
defines = ["__CUDA_ARCH__=890"]
38+
39+
[[compiler.nvcc.passes]]
40+
name = "sm_90"
41+
defines = ["__CUDA_ARCH__=900"]

codebasin/config.py

Lines changed: 88 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,16 +9,21 @@
99
import collections
1010
import logging
1111
import os
12+
import pkgutil
1213
import re
1314
import string
14-
from dataclasses import asdict, dataclass
15+
import tomllib
16+
from dataclasses import asdict, dataclass, field
17+
from pathlib import Path
18+
from typing import Self
1519

1620
from codebasin import CompilationDatabase, util
1721

1822
log = logging.getLogger(__name__)
1923

2024

2125
_importcfg = None
26+
_compilers = None
2227

2328

2429
def _parse_compiler_args(argv: list[str]):
@@ -151,6 +156,88 @@ def __call__(
151156
dest.extend(matches)
152157

153158

159+
@dataclass
160+
class _CompilerMode:
161+
name: str
162+
defines: list[str] = field(default_factory=list)
163+
include_paths: list[str] = field(default_factory=list)
164+
include_files: list[str] = field(default_factory=list)
165+
166+
@classmethod
167+
def from_toml(cls, toml: object) -> Self:
168+
return _CompilerMode(**toml)
169+
170+
171+
@dataclass
172+
class _CompilerPass:
173+
name: str
174+
defines: list[str] = field(default_factory=list)
175+
include_paths: list[str] = field(default_factory=list)
176+
include_files: list[str] = field(default_factory=list)
177+
modes: list[str] = field(default_factory=list)
178+
179+
@classmethod
180+
def from_toml(cls, toml: object) -> Self:
181+
return _CompilerPass(**toml)
182+
183+
184+
@dataclass
185+
class _Compiler:
186+
alias_of: str | None = None
187+
options: list[str] = field(default_factory=list)
188+
parser: list[dict] = field(default_factory=list)
189+
modes: dict[str, _CompilerMode] = field(default_factory=dict)
190+
passes: dict[str, _CompilerPass] = field(default_factory=dict)
191+
192+
@classmethod
193+
def from_toml(cls, toml: object) -> Self:
194+
kwargs = toml.copy()
195+
if "parser" in kwargs:
196+
for option in kwargs["parser"]:
197+
if option["action"] == "store_split":
198+
option["action"] = _StoreSplitAction
199+
if option["action"] == "extend_match":
200+
option["action"] = _ExtendMatchAction
201+
if "modes" in toml:
202+
kwargs["modes"] = {
203+
m["name"]: _CompilerMode.from_toml(m) for m in kwargs["modes"]
204+
}
205+
if "passes" in toml:
206+
kwargs["passes"] = {
207+
p["name"]: _CompilerPass.from_toml(p) for p in kwargs["passes"]
208+
}
209+
return _Compiler(**kwargs)
210+
211+
212+
def _load_compilers():
213+
"""
214+
Load the configuration from the following files:
215+
- ${PACKAGE}/compilers/*.toml
216+
"""
217+
global _compilers
218+
_compilers = {}
219+
220+
# Load the package-provided configuration files.
221+
for compiler in ["clang", "gnu", "intel", "nvidia"]:
222+
filename = str((Path("compilers") / compiler).with_suffix(".toml"))
223+
toml = tomllib.loads(
224+
pkgutil.get_data("codebasin", filename).decode(),
225+
)
226+
try:
227+
util._validate_toml(toml, "cbiconfig")
228+
except ValueError as e:
229+
log.error(str(e))
230+
return
231+
232+
for name, definition in toml["compiler"].items():
233+
_compilers[name] = _Compiler.from_toml(definition)
234+
235+
236+
# Load the compiler configuration when this module is imported.
237+
if not _compilers:
238+
_load_compilers()
239+
240+
154241
@dataclass
155242
class PreprocessorConfiguration:
156243
"""

0 commit comments

Comments
 (0)