Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP: the tip of my filterx performance efforts #434

Open
wants to merge 64 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
ff11d8c
filterx/filterx-scope: keep track of the maximum number of variables
bazsi Jan 4, 2025
97f28d6
tests/copyright: add support for .S files
bazsi Jan 12, 2025
7c4221e
tests/copyright: exclude tests/light/reports directory
bazsi Jan 12, 2025
b01fc34
lib/perf: add support for perf based profiling
bazsi Dec 26, 2024
d187098
logpipe: introduce log_pipe_{pre,post)_config_init_method
bazsi Jan 11, 2025
823025d
cfg-source: cache the result of g_strsplit()
bazsi Jan 11, 2025
46d2cb1
filterx/filterx-expr: fix potential memory leak for expr_text
bazsi Jan 9, 2025
c67284d
filterx/filterx-expr: add expr level detail to perf stacktraces
bazsi Dec 28, 2024
73157be
logpipe: add LogPipe level detail to perf stackdumps
bazsi Jan 11, 2025
e14e3e9
filterx: simplify constructors for nullv assignments
bazsi Dec 23, 2024
8e44174
filterx: rename _eval() methods to specific names
bazsi Dec 28, 2024
893bfb2
filterx/filterx-scope: add filterx_variable_handle_is_message_tied() …
bazsi Jan 1, 2025
e85ae70
filterx/filterx-eval: remove partial support for multiple LogMessage …
bazsi Jan 3, 2025
a59884a
filterx/expr-variable: make template macro based variables read only
bazsi Jan 5, 2025
f5c06d4
filterx/filterx-variable: move FilterXVariableHandle related function…
bazsi Jan 5, 2025
c6f58af
filterx/filterx-variable: rename filterx_variable_free to _clear()
bazsi Jan 5, 2025
5bd49cd
filterx/filterx-variable: introduce "variable_type" at the variable l…
bazsi Jan 5, 2025
795ba18
filterx: do not consider unmarshaling a change in value
bazsi Jan 1, 2025
e1fb711
logmsg: add generation counter
bazsi Jan 1, 2025
b6cccab
Merge branch 'add-syslog-ng-visibility-into-perf-stackdumps' into tip…
bazsi Jan 18, 2025
643b7f6
Merge branch 'filterx-unmarshal-does-not-cause-variables-to-be-dirty'…
bazsi Jan 18, 2025
dac4d42
Merge branch 'logmsg-generation-counter' into tip/axodepot
bazsi Jan 18, 2025
31a1969
Merge branch 'filterx-scope-keep-track-of-maximum-number-of-variables…
bazsi Jan 18, 2025
fb57ac7
tests/light: extract control flow related testcases into a separate file
bazsi Jan 19, 2025
5ee08ed
filterx/object-string: avoid an extra strlen() call in the string typ…
bazsi Jan 17, 2025
25de7b3
filterx/unset-empties: avoid using a GList for keys to unset
bazsi Jan 17, 2025
7aaf225
filterx/filterx-expr: add expr type macros
bazsi Jan 10, 2025
c6cda06
filterx: use FilterXExpr type macros
bazsi Jan 10, 2025
5d07d76
filterx: add filterx_expr_is_getattr/get_subscript() functions
bazsi Jan 9, 2025
a392227
filterx/filterx-scope: remove "log_msg_has_changes"
bazsi Jan 1, 2025
3bf6185
logmsg: make log_msg_make_writable() and related functions inline
bazsi Jan 3, 2025
9bb4dee
filterx/filterx-scope: publish FilterXScope to make it possible to us…
bazsi Jan 3, 2025
7bc7091
filterx/filterx-scope: associate FilterXScope to the message being pr…
bazsi Jan 5, 2025
23205de
filterx/filterx-scope: make filterx_scope_{is,set}_dirty() inline
bazsi Jan 5, 2025
13ac918
filterx/filterx-scope: implement LogMessage change tracking in Filter…
bazsi Jan 5, 2025
075a874
filterx/filterx-scope: make dirty tracking more accurate
bazsi Jan 5, 2025
5ee0c4f
filterx/filterx-scope: add parent_scope tracking
bazsi Jan 3, 2025
391116f
filterx/filterx-scope: retain the generation counter across clone ope…
bazsi Jan 1, 2025
69a7d00
filterx/filterx-scope: implement delayed variable cloning
bazsi Jan 3, 2025
6ba33be
filterx/filterx-scope: allocate variables inline
bazsi Jan 5, 2025
4f1fae4
filterx/filterx-scope: make it possible to allocate FilterXScope on t…
bazsi Jan 3, 2025
4d3a76e
filterx-eval: extract context begin/end code as macros
bazsi Jan 5, 2025
1c0a56e
cfg-source: do proper boundary checking of yylloc values
bazsi Jan 12, 2025
a794bce
merge: getattr opt
bazsi Jan 9, 2025
1319e3e
Revert "merge: getattr opt"
bazsi Jan 11, 2025
815cbae
merge: source extraction for LogPipe
bazsi Jan 11, 2025
4328a51
logpipe: move pipe_next member right after queue
bazsi Jan 12, 2025
bc90d30
logpipe: add optimize() method
bazsi Jan 12, 2025
2ebf5ac
str-format: make format_hex_string*() take const pointer
bazsi Jan 17, 2025
350d422
filterx: add separate "storage" member to FilterXString
bazsi Jan 17, 2025
972e46a
filterx/filterx-object: rename FILTERX_OBJECT_MAGIC_BIAS to FILTERX_O…
bazsi Jan 17, 2025
445c823
filterx/filterx-string: publish FilterXString
bazsi Jan 17, 2025
2212efb
filterx/filterx-object: allow stack allocation of objects
bazsi Jan 17, 2025
53ad6ff
filterx/object-string: support allocation on the stack
bazsi Jan 17, 2025
48133cd
filterx: use stack declared FilterXString instances where it makes sense
bazsi Jan 17, 2025
8e9641f
filterx-grammar: don't require semicolons at the end of an if
bazsi Jan 18, 2025
310d9de
filterx/expr-comparison: export filterx_compare_objects()
bazsi Jan 19, 2025
81db5e9
filterx/expr-compound: add feature to start the compound expr at the …
bazsi Jan 19, 2025
0b65cba
filterx/expr-compound: fix untriggered, but potential use-after-free
bazsi Jan 19, 2025
55d0466
filterx/expr-break: implement "break" statement
bazsi Jan 19, 2025
a6b24e5
filterx/expr-compound: run drop/done/break processing for the last expr
bazsi Jan 19, 2025
ce5ecf9
filterx/expr-switch: add filterx switch case
bazsi Jan 19, 2025
94f8ae4
merge: switch
bazsi Jan 19, 2025
5be65da
appmodel: generate switch-case instead of a series of if-elif-else fo…
bazsi Jan 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions cmake/syslog-ng-config.h.in
Original file line number Diff line number Diff line change
Expand Up @@ -106,3 +106,4 @@
#cmakedefine01 SYSLOG_NG_HAVE_SO_MEMINFO
#cmakedefine01 SYSLOG_NG_ENABLE_AFSOCKET_MEMINFO_METRICS
#cmakedefine01 SYSLOG_NG_HAVE_IV_WORK_POOL_SUBMIT_CONTINUATION
#cmakedefine01 SYSLOG_NG_ENABLE_PERF
18 changes: 18 additions & 0 deletions configure.ac
Original file line number Diff line number Diff line change
Expand Up @@ -266,6 +266,10 @@ AC_ARG_ENABLE(ebpf,
[ --enable-ebpf Enable support for loading of eBPF programs (default: no)]
,,enable_ebpf="no")

AC_ARG_ENABLE(perf,
[ --enable-perf Enable support for the Linux perf tool (default: auto)]
,,enable_perf="auto")

AC_ARG_ENABLE(gcov,
[ --enable-gcov Enable coverage profiling (default: no)]
,,enable_gcov="no")
Expand Down Expand Up @@ -466,6 +470,7 @@ dnl Checks for programs.
AC_PROG_CC
AC_PROG_CC_C99
AM_PROG_CC_C_O
AM_PROG_AS
if test "x$ac_cv_prog_cc_c99" = "xno"; then
AC_MSG_ERROR([C99 standard compliant C compiler required. Try GCC 3.x or later.])
fi
Expand Down Expand Up @@ -2060,6 +2065,16 @@ if test "x$enable_ebpf" = "xyes"; then
AC_SUBST(BPF_CC)
fi

if test "x$enable_perf" = "xauto"; then
uname_s=`uname -s`
uname_m=`uname -m`
if test "$uname_s" = "Linux" -a "$uname_m" = "x86_64"; then
enable_perf="yes"
else
enable_perf="no"
fi
fi

dnl ***************************************************************************
dnl check if we have timezone variable in <time.h>
dnl ***************************************************************************
Expand Down Expand Up @@ -2243,6 +2258,7 @@ AC_DEFINE_UNQUOTED(ENABLE_IPV6, `enable_value $enable_ipv6`, [Enable IPv6 suppor
AC_DEFINE_UNQUOTED(ENABLE_TCP_WRAPPER, `enable_value $enable_tcp_wrapper`, [Enable TCP wrapper support])
AC_DEFINE_UNQUOTED(ENABLE_LINUX_CAPS, `enable_value $enable_linux_caps`, [Enable Linux capability management support])
AC_DEFINE_UNQUOTED(ENABLE_EBPF, `enable_value $enable_ebpf`, [Enable Linux eBPF support])
AC_DEFINE_UNQUOTED(ENABLE_PERF, `enable_value $enable_perf`, [Enable Linux perf support])
AC_DEFINE_UNQUOTED(ENABLE_ENV_WRAPPER, `enable_value $enable_env_wrapper`, [Enable environment wrapper support])
AC_DEFINE_UNQUOTED(ENABLE_SYSTEMD, `enable_value $enable_systemd`, [Enable systemd support])
AC_DEFINE_UNQUOTED(ENABLE_KAFKA, `enable_value $enable_kafka`, [Enable kafka support])
Expand All @@ -2259,6 +2275,7 @@ AM_CONDITIONAL(ENABLE_SUN_STREAMS, [test "$enable_sun_streams" = "yes"])
AM_CONDITIONAL(ENABLE_DARWIN_OSL, [test "$enable_darwin_osl" = "yes"])
AM_CONDITIONAL(ENABLE_OPENBSD_SYSTEM_SOURCE, [test "$enable_openbsd_system_source" = "yes"])
AM_CONDITIONAL(ENABLE_EBPF, [test "$enable_ebpf" = "yes"])
AM_CONDITIONAL(ENABLE_PERF, [test "$enable_perf" = "yes"])
AM_CONDITIONAL(ENABLE_PACCT, [test "$enable_pacct" = "yes"])
AM_CONDITIONAL(ENABLE_MONGODB, [test "$enable_mongodb" = "yes"])
AM_CONDITIONAL(ENABLE_SMTP, [test "$enable_smtp" = "yes"])
Expand Down Expand Up @@ -2414,6 +2431,7 @@ echo " Env wrapper support : ${enable_env_wrapper:=no}"
echo " systemd support : ${enable_systemd:=no} (unit dir: ${systemdsystemunitdir:=none})"
echo " systemd-journal support : ${with_systemd_journal:=no}"
echo " JSON support : $with_jsonc"
echo " perf support : ${enable_perf:=no}"
echo " Build options:"
echo " Generate manual pages : ${enable_manpages:=no}"
echo " Install manual pages : ${enable_manpages_install:=no}"
Expand Down
4 changes: 3 additions & 1 deletion lib/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ include lib/logthrsource/Makefile.am
include lib/logthrdest/Makefile.am
include lib/signal-slot-connector/Makefile.am
include lib/multi-line/Makefile.am
include lib/perf/Makefile.am

LSNG_RELEASE = $(shell echo @PACKAGE_VERSION@ | cut -d. -f1,2)

Expand Down Expand Up @@ -307,7 +308,8 @@ lib_libsyslog_ng_la_SOURCES = \
$(multiline_sources) \
$(logthrsource_sources) \
$(logthrdest_sources) \
$(signal_slot_connector_sources)
$(signal_slot_connector_sources) \
$(perf_sources)

lib_libsyslog_ng_la_CFLAGS = \
$(AM_CFLAGS) \
Expand Down
7 changes: 5 additions & 2 deletions lib/afinter.c
Original file line number Diff line number Diff line change
Expand Up @@ -414,7 +414,7 @@ static gboolean
afinter_sd_pre_config_init(LogPipe *s)
{
main_loop_worker_allocate_thread_space(1);
return TRUE;
return log_pipe_pre_config_init_method(s);
}

static gboolean
Expand Down Expand Up @@ -459,7 +459,10 @@ afinter_sd_post_config_init(LogPipe *s)
{
AFInterSourceDriver *self = (AFInterSourceDriver *) s;

return afinter_source_start_thread(self->source);
if (!afinter_source_start_thread(self->source))
return FALSE;

return log_pipe_post_config_init_method(s);
}

static gboolean
Expand Down
4 changes: 2 additions & 2 deletions lib/cfg-grammar.y
Original file line number Diff line number Diff line change
Expand Up @@ -567,14 +567,14 @@ expr_stmt
source_stmt
: KW_SOURCE string '{' source_content '}'
{
$$ = log_expr_node_new_source($2, $4, &@1);
$$ = log_expr_node_new_source($2, $4, &@$);
free($2);
}
;
dest_stmt
: KW_DESTINATION string '{' dest_content '}'
{
$$ = log_expr_node_new_destination($2, $4, &@1);
$$ = log_expr_node_new_destination($2, $4, &@$);
free($2);
}
;
Expand Down
2 changes: 2 additions & 0 deletions lib/cfg-lexer.c
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,7 @@ cfg_lexer_init_include_level_buffer(CfgLexer *self, CfgIncludeLevel *level,
level->buffer.content = lexer_buffer;
level->buffer.content_length = lexer_buffer_len;
level->buffer.original_content = g_strdup(lexer_buffer);
level->buffer.original_lines = NULL;
}

gboolean
Expand Down Expand Up @@ -458,6 +459,7 @@ cfg_lexer_include_level_clear(CfgLexer *self, CfgIncludeLevel *level)
{
g_free(level->buffer.content);
g_free(level->buffer.original_content);
g_strfreev(level->buffer.original_lines);
}
memset(level, 0, sizeof(*level));
}
Expand Down
1 change: 1 addition & 0 deletions lib/cfg-lexer.h
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,7 @@ struct _CfgIncludeLevel
{
/* the lexer mutates content, so save it for error reporting */
gchar *original_content;
gchar **original_lines;
/* buffer for the lexer */
gchar *content;
gsize content_length;
Expand Down
38 changes: 27 additions & 11 deletions lib/cfg-source.c
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ _extract_source_from_file_location(GString *result, const gchar *filename, const
FILE *f;
gint lineno = 0;
gint buflen = 65520;
gchar *line = g_malloc(buflen);
gboolean res = FALSE;

if (yylloc->first_column < 1 || yylloc->last_column < 1 ||
yylloc->first_column > buflen-1 || yylloc->last_column > buflen-1)
Expand All @@ -183,6 +183,7 @@ _extract_source_from_file_location(GString *result, const gchar *filename, const
if (!f)
return FALSE;

gchar *line = g_malloc(buflen);
while (fgets(line, buflen, f))
{
lineno++;
Expand Down Expand Up @@ -216,19 +217,23 @@ _extract_source_from_file_location(GString *result, const gchar *filename, const
}
}
fclose(f);
res = TRUE;

/* NOTE: do we have the appropriate number of lines? */
if (lineno <= yylloc->first_line)
return FALSE;

res = FALSE;
g_free(line);
return TRUE;
return res;
}

static gboolean
_extract_source_from_buffer_location(GString *result, const gchar *buffer_content, const CFG_LTYPE *yylloc)
_extract_source_from_buffer_location(GString *result, CfgIncludeLevel *level, const CFG_LTYPE *yylloc)
{
gchar **lines = g_strsplit(buffer_content, "\n", yylloc->last_line + 1);
const gchar *buffer_content = level->buffer.original_content;
gchar **lines = level->buffer.original_lines;

if (!lines)
lines = level->buffer.original_lines = g_strsplit(buffer_content, "\n", 0);
gint num_lines = g_strv_length(lines);

if (num_lines <= yylloc->first_line)
Expand All @@ -244,10 +249,18 @@ _extract_source_from_buffer_location(GString *result, const gchar *buffer_conten

if (lineno == yylloc->first_line)
{
gint token_start = MIN(linelen, yylloc->first_column - 1);

if (yylloc->first_line == yylloc->last_line)
g_string_append_len(result, &line[MIN(linelen, yylloc->first_column-1)], yylloc->last_column - yylloc->first_column);
{
/* both last_column & first_column are 1 based, they cancel that out */
gint token_len = yylloc->last_column - yylloc->first_column;
if (token_start + token_len > linelen)
token_len = linelen - token_start;
g_string_append_len(result, &line[token_start], token_len);
}
else
g_string_append(result, &line[MIN(linelen, yylloc->first_column-1)]);
g_string_append(result, &line[token_start]);
}
else if (lineno < yylloc->last_line)
{
Expand All @@ -256,13 +269,16 @@ _extract_source_from_buffer_location(GString *result, const gchar *buffer_conten
}
else if (lineno == yylloc->last_line)
{
/* last_column is 1 based */
gint token_len = yylloc->last_column - 1;
if (token_len > linelen)
token_len = linelen;
g_string_append_c(result, ' ');
g_string_append_len(result, line, yylloc->last_column);
g_string_append_len(result, line, token_len);
}
}

exit:
g_strfreev(lines);
return TRUE;
}

Expand All @@ -279,7 +295,7 @@ cfg_source_extract_source_text(CfgLexer *lexer, const CFG_LTYPE *yylloc, GString
CFG_LTYPE buf_lloc = *yylloc;
cfg_lexer_undo_set_file_location(lexer, &buf_lloc);

return _extract_source_from_buffer_location(result, level->buffer.original_content, &buf_lloc);
return _extract_source_from_buffer_location(result, level, &buf_lloc);
}
else
g_assert_not_reached();
Expand Down
47 changes: 45 additions & 2 deletions lib/cfg-tree.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "logmpx.h"
#include "logpipe.h"
#include "metrics-pipe.h"
#include "cfg-source.h"

#include <string.h>

Expand Down Expand Up @@ -282,6 +283,13 @@ log_expr_node_new(gint layout, gint content, const gchar *name, LogExprNode *chi
self->line = yylloc->first_line;
self->column = yylloc->first_column;
}
if (yylloc && (debug_flag || 1))
{
CFG_LTYPE lloc = *yylloc;
GString *text = g_string_new("");
cfg_source_extract_source_text(configuration->lexer, &lloc, text);
self->expr_text = g_string_free(text, FALSE);
}
return self;
}

Expand All @@ -308,6 +316,7 @@ _log_expr_node_free(LogExprNode *self)
self->aux_destroy(self->aux);
g_free(self->name);
g_free(self->filename);
g_free(self->expr_text);
g_free(self);
}

Expand Down Expand Up @@ -645,6 +654,7 @@ log_expr_node_lookup_flag(const gchar *flag)
return 0;
}

/* stores the ref to @pipe */
static LogPipe *
cfg_tree_assoc_pipe(CfgTree *self, LogExprNode *node, LogPipe *pipe, const gchar *info)
{
Expand Down Expand Up @@ -1610,6 +1620,40 @@ cfg_tree_stop(CfgTree *self)
return success;
}

gboolean
cfg_tree_optimize(CfgTree *self)
{
gint i;

g_assert(self->compiled);

for (i = 0; i < self->initialized_pipes->len; i++)
{
LogPipe **ppipe = (LogPipe **) &g_ptr_array_index(self->initialized_pipes, i);
LogPipe *pipe = *ppipe;

log_pipe_optimize(&pipe);
if (pipe != *ppipe)
{
// log_pipe_unref(*ppipe);
*ppipe = log_pipe_ref(pipe);
}
}

for (i = 0; i < self->initialized_pipes->len;)
{
if (g_ptr_array_index(self->initialized_pipes, i) == NULL)
{
g_ptr_array_remove_index(self->initialized_pipes, i);
}
else
i++;
}


return TRUE;
}

gboolean
cfg_tree_pre_config_init(CfgTree *self)
{
Expand Down Expand Up @@ -1658,7 +1702,7 @@ void
cfg_tree_init_instance(CfgTree *self, GlobalConfig *cfg)
{
memset(self, 0, sizeof(*self));
self->initialized_pipes = g_ptr_array_new();
self->initialized_pipes = g_ptr_array_new_with_free_func((GDestroyNotify) log_pipe_unref);
self->objects = g_hash_table_new_full(cfg_tree_objects_hash, cfg_tree_objects_equal, NULL,
(GDestroyNotify) log_expr_node_unref);
self->templates = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify) log_template_unref);
Expand All @@ -1670,7 +1714,6 @@ cfg_tree_init_instance(CfgTree *self, GlobalConfig *cfg)
void
cfg_tree_free_instance(CfgTree *self)
{
g_ptr_array_foreach(self->initialized_pipes, (GFunc) log_pipe_unref, NULL);
g_ptr_array_free(self->initialized_pipes, TRUE);

g_ptr_array_foreach(self->rules, (GFunc) log_expr_node_unref, NULL);
Expand Down
2 changes: 2 additions & 0 deletions lib/cfg-tree.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ struct _LogExprNode
gchar *filename;
gint line, column;
gint child_id;
gchar *expr_text;
};

gint log_expr_node_lookup_flag(const gchar *flag);
Expand Down Expand Up @@ -187,6 +188,7 @@ gchar *cfg_tree_get_rule_name(CfgTree *self, gint content, LogExprNode *node);
gchar *cfg_tree_get_child_id(CfgTree *self, gint content, LogExprNode *node);

gboolean cfg_tree_compile(CfgTree *self);
gboolean cfg_tree_optimize(CfgTree *self);
gboolean cfg_tree_start(CfgTree *self);
gboolean cfg_tree_stop(CfgTree *self);
gboolean cfg_tree_pre_config_init(CfgTree *self);
Expand Down
2 changes: 2 additions & 0 deletions lib/cfg.c
Original file line number Diff line number Diff line change
Expand Up @@ -301,6 +301,8 @@ cfg_init(GlobalConfig *cfg)
return FALSE;
if (!cfg_tree_compile(&cfg->tree))
return FALSE;
if (!cfg_tree_optimize(&cfg->tree))
return FALSE;
app_config_pre_pre_init();
if (!cfg_tree_pre_config_init(&cfg->tree))
return FALSE;
Expand Down
4 changes: 4 additions & 0 deletions lib/filterx/Makefile.am
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ filterxinclude_HEADERS = \
lib/filterx/expr-condition.h \
lib/filterx/expr-done.h \
lib/filterx/expr-drop.h \
lib/filterx/expr-break.h \
lib/filterx/expr-function.h \
lib/filterx/expr-generator.h \
lib/filterx/expr-get-subscript.h \
Expand All @@ -24,6 +25,7 @@ filterxinclude_HEADERS = \
lib/filterx/expr-regexp.h \
lib/filterx/expr-set-subscript.h \
lib/filterx/expr-setattr.h \
lib/filterx/expr-switch.h \
lib/filterx/expr-template.h \
lib/filterx/expr-unset.h \
lib/filterx/expr-variable.h \
Expand Down Expand Up @@ -75,6 +77,7 @@ filterx_sources = \
lib/filterx/expr-condition.c \
lib/filterx/expr-done.c \
lib/filterx/expr-drop.c \
lib/filterx/expr-break.c \
lib/filterx/expr-function.c \
lib/filterx/expr-generator.c \
lib/filterx/expr-get-subscript.c \
Expand All @@ -91,6 +94,7 @@ filterx_sources = \
lib/filterx/expr-regexp.c \
lib/filterx/expr-set-subscript.c \
lib/filterx/expr-setattr.c \
lib/filterx/expr-switch.c \
lib/filterx/expr-template.c \
lib/filterx/expr-unset.c \
lib/filterx/expr-variable.c \
Expand Down
Loading
Loading