Blame scripts/gen-py-const.awk

Packit Service 82fcde
# Script to generate constants for Python pretty printers.
Packit Service 82fcde
#
Packit Service 82fcde
# Copyright (C) 2016-2018 Free Software Foundation, Inc.
Packit Service 82fcde
# This file is part of the GNU C Library.
Packit Service 82fcde
#
Packit Service 82fcde
# The GNU C Library is free software; you can redistribute it and/or
Packit Service 82fcde
# modify it under the terms of the GNU Lesser General Public
Packit Service 82fcde
# License as published by the Free Software Foundation; either
Packit Service 82fcde
# version 2.1 of the License, or (at your option) any later version.
Packit Service 82fcde
#
Packit Service 82fcde
# The GNU C Library is distributed in the hope that it will be useful,
Packit Service 82fcde
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 82fcde
# Lesser General Public License for more details.
Packit Service 82fcde
#
Packit Service 82fcde
# You should have received a copy of the GNU Lesser General Public
Packit Service 82fcde
# License along with the GNU C Library; if not, see
Packit Service 82fcde
# <http://www.gnu.org/licenses/>.
Packit Service 82fcde
Packit Service 82fcde
# This script is a smaller version of the clever gen-asm-const.awk hack used to
Packit Service 82fcde
# generate ASM constants from .sym files.  We'll use this to generate constants
Packit Service 82fcde
# for Python pretty printers.
Packit Service 82fcde
#
Packit Service 82fcde
# The input to this script are .pysym files that look like:
Packit Service 82fcde
# #C_Preprocessor_Directive...
Packit Service 82fcde
# NAME1
Packit Service 82fcde
# NAME2 expression...
Packit Service 82fcde
#
Packit Service 82fcde
# A line giving just a name implies an expression consisting of just that name.
Packit Service 82fcde
# Comments start with '--'.
Packit Service 82fcde
#
Packit Service 82fcde
# The output of this script is a 'dummy' function containing 'asm' declarations
Packit Service 82fcde
# for each non-preprocessor line in the .pysym file.  The expression values
Packit Service 82fcde
# will appear as input operands to the 'asm' declaration.  For example, if we
Packit Service 82fcde
# have:
Packit Service 82fcde
#
Packit Service 82fcde
# /* header.h */
Packit Service 82fcde
# #define MACRO 42
Packit Service 82fcde
#
Packit Service 82fcde
# struct S {
Packit Service 82fcde
#     char c1;
Packit Service 82fcde
#     char c2;
Packit Service 82fcde
#     char c3;
Packit Service 82fcde
# };
Packit Service 82fcde
#
Packit Service 82fcde
# enum E {
Packit Service 82fcde
#     ZERO,
Packit Service 82fcde
#     ONE
Packit Service 82fcde
# };
Packit Service 82fcde
#
Packit Service 82fcde
# /* symbols.pysym */
Packit Service 82fcde
# #include <stddef.h>
Packit Service 82fcde
# #include "header.h"
Packit Service 82fcde
# -- This is a comment
Packit Service 82fcde
# MACRO
Packit Service 82fcde
# C3_OFFSET offsetof(struct S, c3)
Packit Service 82fcde
# E_ONE ONE
Packit Service 82fcde
#
Packit Service 82fcde
# the output will be:
Packit Service 82fcde
#
Packit Service 82fcde
# #include <stddef.h>
Packit Service 82fcde
# #include "header.h"
Packit Service 82fcde
# void dummy(void)
Packit Service 82fcde
# {
Packit Service 82fcde
#   asm ("@name@MACRO@value@%0@" : : "i" (MACRO));
Packit Service 82fcde
#   asm ("@name@C3_OFFSET@value@%0@" : : "i" (offsetof(struct S, c3)));
Packit Service 82fcde
#   asm ("@name@E_ONE@value@%0@" : : "i" (ONE));
Packit Service 82fcde
# }
Packit Service 82fcde
#
Packit Service 82fcde
# We'll later feed this output to gcc -S.  Since '-S' tells gcc to compile but
Packit Service 82fcde
# not assemble, gcc will output something like:
Packit Service 82fcde
#
Packit Service 82fcde
# dummy:
Packit Service 82fcde
# 	...
Packit Service 82fcde
# 	@name@MACRO@value@$42@
Packit Service 82fcde
# 	@name@C3_OFFSET@value@$2@
Packit Service 82fcde
# 	@name@E_ONE@value@$1@
Packit Service 82fcde
#
Packit Service 82fcde
# Finally, we can process that output to extract the constant values.
Packit Service 82fcde
# Notice gcc may prepend a special character such as '$' to each value.
Packit Service 82fcde
Packit Service 82fcde
# found_symbol indicates whether we found a non-comment, non-preprocessor line.
Packit Service 82fcde
BEGIN { found_symbol = 0 }
Packit Service 82fcde
Packit Service 82fcde
# C preprocessor directives go straight through.
Packit Service 82fcde
/^#/ { print; next; }
Packit Service 82fcde
Packit Service 82fcde
# Skip comments.
Packit Service 82fcde
/--/ { next; }
Packit Service 82fcde
Packit Service 82fcde
# Trim leading whitespace.
Packit Service 82fcde
{ sub(/^[[:blank:]]*/, ""); }
Packit Service 82fcde
Packit Service 82fcde
# If we found a non-comment, non-preprocessor line, print the 'dummy' function
Packit Service 82fcde
# header.
Packit Service 82fcde
NF > 0 && !found_symbol {
Packit Service 82fcde
    print "void dummy(void)\n{";
Packit Service 82fcde
    found_symbol = 1;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
# If the line contains just a name, duplicate it so we can use that name
Packit Service 82fcde
# as the value of the expression.
Packit Service 82fcde
NF == 1 { sub(/^.*$/, "& &";; }
Packit Service 82fcde
Packit Service 82fcde
# If a line contains a name and an expression...
Packit Service 82fcde
NF > 1 {
Packit Service 82fcde
    name = $1;
Packit Service 82fcde
Packit Service 82fcde
    # Remove any characters before the second field.
Packit Service 82fcde
    sub(/^[^[:blank:]]+[[:blank:]]+/, "");
Packit Service 82fcde
Packit Service 82fcde
    # '$0' ends up being everything that appeared after the first field
Packit Service 82fcde
    # separator.
Packit Service 82fcde
    printf "  asm (\"@name@%s@value@%0@\" : : \"i\" (%s));\n", name, $0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
# Close the 'dummy' function.
Packit Service 82fcde
END { if (found_symbol) print "}"; }