aboutsummaryrefslogtreecommitdiff
path: root/Makerules
diff options
context:
space:
mode:
authorJosh Kunz <jkz@google.com>2019-08-07 11:40:50 -0700
committerFangrui Song <i@maskray.me>2021-08-27 17:26:02 -0700
commitad41eacfb70e98e13cbfda076ded0c77b387ae8b (patch)
treec137dd765a7f4f65c315addcac10a08932ef8059 /Makerules
parent8d141ab782c4444a5e8f2e6eadfba7dea504f70d (diff)
downloadglibc-ad41eacfb70e98e13cbfda076ded0c77b387ae8b.zip
glibc-ad41eacfb70e98e13cbfda076ded0c77b387ae8b.tar.gz
glibc-ad41eacfb70e98e13cbfda076ded0c77b387ae8b.tar.bz2
Make gen-XX-const scripts work with llvm-as
The gen-as-const and gen-py-const scripts are used to generate integer constant definitions from a list of constant C-expressions. This is achieved by generating a C program with inline `asm` statements, that depend on these constant expressions. During compilation, the constant expressions are evaluated, and included in the inline asm. The build process generates only the assembly, and then used `sed` to extract the values from the assembly text. This is clever. It allows the build process to extract the value of C statements built under the target architecture. The implementation is a bit fragile, but it is not immediately obvious to me how it could be improved. This change slightly modifies `gen-as-const` and `gen-py-const` to emit valid assembly directives instead of invalid directives that were previously emitted. Since the values are extracted via string parsing, this has no effect on the values extracted. This is needed because the LLVM assembler validates all statements before emitting them, whereas it appears GCC will literally emit any `asm` directives without validation or recognition.
Diffstat (limited to 'Makerules')
-rw-r--r--Makerules5
1 files changed, 2 insertions, 3 deletions
diff --git a/Makerules b/Makerules
index 6528790..1bffdcc 100644
--- a/Makerules
+++ b/Makerules
@@ -260,7 +260,7 @@ $(py-const): $(py-const-dir)%.py: %.pysym $(py-const-script) \
$(common-before-compile)
$(make-target-directory)
$(AWK) -f $(py-const-script) $< \
- | $(CC) -S $(MOARFLAGS) -o $@.tmp $(CFLAGS) $(CPPFLAGS) -x c -
+ | $(CC) -S -o $@.tmp $(CFLAGS) $(CPPFLAGS) -x c -
echo '# GENERATED FILE\n' > $@.tmp2
echo '# Constant definitions for pretty printers.' >> $@.tmp2
echo '# See gen-py-const.awk for details.\n' >> $@.tmp2
@@ -276,11 +276,10 @@ ifdef gen-as-const-headers
# Generating headers for assembly constants.
# We need this defined early to get into before-compile before
# it's used in sysd-rules, below.
-# clang's integrated assembler doesn't like the freaky tokens.
$(common-objpfx)%.h $(common-objpfx)%.h.d: $(..)scripts/gen-as-const.awk \
%.sym $(common-before-compile)
$(AWK) -f $< $(filter %.sym,$^) \
- | $(CC) -S $(MOARFLAGS) -o $(@:.h.d=.h)T3 $(CFLAGS) $(CPPFLAGS) -x c - \
+ | $(CC) -S -o $(@:.h.d=.h)T3 $(CFLAGS) $(CPPFLAGS) -x c - \
-MD -MP -MF $(@:.h=.h.d)T -MT '$(@:.h=.h.d) $(@:.h.d=.h)'
sed -n 's/^.*@@@name@@@\([^@]*\)@@@value@@@[^0-9Xxa-fA-F-]*\([0-9Xxa-fA-F-][0-9Xxa-fA-F-]*\).*@@@end@@@.*$$/#define \1 \2/p' \
$(@:.h.d=.h)T3 > $(@:.h.d=.h)T