Skip to content

Commit 717ba19

Browse files
committed
meson: Add LLVM bitcode emission
This needs a bit more love before being ready...
1 parent be5bbed commit 717ba19

File tree

6 files changed

+107
-11
lines changed

6 files changed

+107
-11
lines changed

contrib/citext/meson.build

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,3 +40,8 @@ tests += {
4040
],
4141
},
4242
}
43+
44+
bitcode_modules += {
45+
'target': citext,
46+
'srcfiles': citext_sources,
47+
}

meson.build

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -759,6 +759,8 @@ if not llvmopt.disabled()
759759

760760
ccache = find_program('ccache', native: true, required: false)
761761
clang = find_program(llvm_binpath / 'clang', required: true)
762+
llvm_lto = find_program(llvm_binpath / 'llvm-lto', required: true)
763+
irlink = find_program('src/tools/irlink', native: true)
762764
endif
763765
else
764766
llvm = not_found_dep
@@ -2599,6 +2601,10 @@ nls_targets = []
25992601
test_deps = []
26002602
tests = []
26012603

2604+
# List of object files + source files to generated LLVM IR for inlining.
2605+
# Each element is a hash of {'target': target, 'srcfiles': ...}.
2606+
bitcode_modules = []
2607+
26022608

26032609
# Default options for targets
26042610

@@ -2907,6 +2913,11 @@ subdir('src/interfaces/ecpg/test')
29072913

29082914
subdir('doc/src/sgml')
29092915

2916+
# generate bitcode for JIT inlining after giving contrib modules etc a chance
2917+
# to add themselves to bitcode_modules[]
2918+
subdir('src/backend/jit/llvm/bitcode', if_found: llvm)
2919+
2920+
29102921
generated_sources_ac += {'': ['GNUmakefile']}
29112922

29122923
# After processing src/test, add test_install_libs to the testprep_targets
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# Copyright (c) 2022-2023, PostgreSQL Global Development Group
2+
#
3+
# emit LLVM bitcode for JIT inlining
4+
5+
assert(llvm.found())
6+
7+
foreach bitcode_module : bitcode_modules
8+
bitcode_targets = []
9+
bitcode_obj = bitcode_module['target']
10+
if 'name' not in bitcode_module
11+
bitcode_name = bitcode_obj.name()
12+
else
13+
bitcode_name = bitcode_module['name']
14+
endif
15+
16+
foreach srcfile : bitcode_module['srcfiles']
17+
srcfilename = '@0@'.format(srcfile)
18+
targetname = '@0@_@1@_@[email protected]'.format(
19+
bitcode_name,
20+
fs.parent(srcfilename).underscorify(), fs.name(srcfilename))
21+
bitcode_targets += custom_target(
22+
targetname,
23+
input: [srcfile, bitcode_obj.extract_objects(srcfile)],
24+
output: targetname,
25+
command: [llvm_irgen_command, bitcode_cflags],
26+
install: true,
27+
install_dir: dir_bitcode,
28+
)
29+
endforeach
30+
31+
index_name = '@[email protected]'.format(bitcode_name)
32+
bitcode_index = custom_target('@0@'.format(bitcode_name),
33+
output: index_name,
34+
input: bitcode_targets,
35+
command: [irlink, '--lto', llvm_lto, '--outdir', '@OUTDIR@', '--index', index_name, '@INPUT@'],
36+
install: true,
37+
install_dir: dir_bitcode,
38+
)
39+
backend_targets += bitcode_index
40+
endforeach

src/backend/jit/llvm/meson.build

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -41,21 +41,20 @@ backend_targets += llvmjit
4141

4242
# Define a few bits and pieces used here and elsewhere to generate bitcode
4343

44-
llvm_irgen_args = [
45-
'-c', '-o', '@OUTPUT@', '@INPUT@',
44+
llvm_irgen_command = []
45+
if ccache.found()
46+
llvm_irgen_command += ccache
47+
endif
48+
49+
llvm_irgen_command += [
50+
clang,
51+
'-c', '-o', '@OUTPUT0@', '@INPUT0@',
4652
'-flto=thin', '-emit-llvm',
47-
'-MD', '-MQ', '@OUTPUT@', '-MF', '@DEPFILE@',
4853
'-O2',
4954
'-Wno-ignored-attributes',
5055
'-Wno-empty-body',
5156
]
52-
53-
if ccache.found()
54-
llvm_irgen_command = ccache
55-
llvm_irgen_args = [clang.path()] + llvm_irgen_args
56-
else
57-
llvm_irgen_command = clang
58-
endif
57+
llvm_irgen_dep_args = ['-MD', '-MQ', '@OUTPUT0@', '-MF', '@DEPFILE@']
5958

6059

6160
# XXX: Need to determine proper version of the function cflags for clang
@@ -74,7 +73,7 @@ bitcode_cflags += '-I@SOURCE_ROOT@/src/include'
7473
# Note this is intentionally not installed to bitcodedir, as it's not for
7574
# inlining
7675
llvmjit_types = custom_target('llvmjit_types.bc',
77-
command: [llvm_irgen_command] + llvm_irgen_args + bitcode_cflags,
76+
command: llvm_irgen_command + llvm_irgen_dep_args + bitcode_cflags,
7877
input: 'llvmjit_types.c',
7978
output: 'llvmjit_types.bc',
8079
depends: [postgres],
@@ -83,3 +82,11 @@ llvmjit_types = custom_target('llvmjit_types.bc',
8382
depfile: '@[email protected]',
8483
)
8584
backend_targets += llvmjit_types
85+
86+
# Figure out -I's needed to build all postgres code, including all its
87+
# dependencies
88+
pkg_config = find_program(['pkg-config', 'pkgconf'], required: true)
89+
r = run_command(pkg_config,
90+
['--cflags-only-I', meson.build_root() / 'meson-uninstalled/postgresql-extension-uninstalled.pc'],
91+
check: true)
92+
bitcode_cflags += r.stdout().split()

src/backend/meson.build

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,14 @@ postgres = executable('postgres',
147147

148148
backend_targets += postgres
149149

150+
151+
bitcode_modules += {
152+
'name': 'postgres',
153+
'target': postgres_lib,
154+
'srcfiles': backend_sources,
155+
}
156+
157+
150158
pg_mod_c_args = cflags_mod
151159
pg_mod_cpp_args = cxxflags_mod
152160
pg_mod_link_args = ldflags_sl + ldflags_mod

src/tools/irlink

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
#!/usr/bin/env python3
2+
3+
import os
4+
import shutil
5+
import subprocess
6+
import sys
7+
import argparse
8+
9+
parser = argparse.ArgumentParser(
10+
description='generate PostgreSQL JIT IR module')
11+
12+
parser.add_argument('--index', type=str, required=True)
13+
parser.add_argument('--lto', type=str, required=True)
14+
parser.add_argument('--outdir', type=str, required=True)
15+
parser.add_argument('INPUT', type=str, nargs='+')
16+
17+
args = parser.parse_args()
18+
19+
file_names = [os.path.basename(f) for f in args.INPUT]
20+
command = [args.lto,
21+
'-thinlto', '-thinlto-action=thinlink',
22+
'-o', args.index] + file_names
23+
res = subprocess.run(command, cwd=args.outdir)
24+
25+
exit(res.returncode)

0 commit comments

Comments
 (0)