diff options
author | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-15 17:09:20 +0300 |
---|---|---|
committer | Marko Mäkelä <marko.makela@mariadb.com> | 2020-05-15 17:23:08 +0300 |
commit | ff66d65a096ec02dda1ab449d84a40361551085c (patch) | |
tree | 62758be70a0df31bc0c376f948ef1dba3cc58b7b | |
parent | 1cac6d48282459d8855c1cec1eeb4bc0e3db5f89 (diff) | |
download | mariadb-git-ff66d65a096ec02dda1ab449d84a40361551085c.tar.gz |
Amend af784385b4a2b286000fa2c658e34283fe7bba60: Avoid vtable overhead
When neither MSAN nor Valgrind are enabled, declare
Field::mark_unused_memory_as_defined() as an empty inline function,
instead of declaring it as a virtual function.
-rw-r--r-- | include/my_valgrind.h | 4 | ||||
-rw-r--r-- | sql/field.cc | 7 | ||||
-rw-r--r-- | sql/field.h | 10 |
3 files changed, 16 insertions, 5 deletions
diff --git a/include/my_valgrind.h b/include/my_valgrind.h index 3cd4210dc3b..dc0c9bcfad4 100644 --- a/include/my_valgrind.h +++ b/include/my_valgrind.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2010, 2019, MariaDB Corporation. +/* Copyright (C) 2010, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -32,6 +32,7 @@ #if defined(HAVE_VALGRIND_MEMCHECK_H) && defined(HAVE_valgrind) # include <valgrind/memcheck.h> +# define HAVE_valgrind_or_MSAN # define MEM_UNDEFINED(a,len) VALGRIND_MAKE_MEM_UNDEFINED(a,len) # define MEM_MAKE_DEFINED(a,len) VALGRIND_MAKE_MEM_DEFINED(a,len) # define MEM_NOACCESS(a,len) VALGRIND_MAKE_MEM_NOACCESS(a,len) @@ -50,6 +51,7 @@ https://github.com/google/sanitizers/wiki/AddressSanitizerManualPoisoning */ # define REDZONE_SIZE 8 #elif __has_feature(memory_sanitizer) # include <sanitizer/msan_interface.h> +# define HAVE_valgrind_or_MSAN # define MEM_UNDEFINED(a,len) __msan_allocated_memory(a,len) # define MEM_MAKE_DEFINED(a,len) __msan_unpoison(a,len) # define MEM_NOACCESS(a,len) ((void) 0) diff --git a/sql/field.cc b/sql/field.cc index 9ab76aa37a4..d1bd5860f06 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -1,6 +1,6 @@ /* Copyright (c) 2000, 2017, Oracle and/or its affiliates. - Copyright (c) 2008, 2017, MariaDB + Copyright (c) 2008, 2020, MariaDB This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -7772,11 +7772,14 @@ my_decimal *Field_varstring::val_decimal(my_decimal *decimal_value) } + +#ifdef HAVE_valgrind_or_MSAN void Field_varstring::mark_unused_memory_as_defined() { - uint used_length __attribute__((unused)) = get_length(); + uint used_length= get_length(); MEM_MAKE_DEFINED(get_data() + used_length, field_length - used_length); } +#endif int Field_varstring::cmp_max(const uchar *a_ptr, const uchar *b_ptr, diff --git a/sql/field.h b/sql/field.h index ea57a4f07cc..3007e666ba7 100644 --- a/sql/field.h +++ b/sql/field.h @@ -1,7 +1,7 @@ #ifndef FIELD_INCLUDED #define FIELD_INCLUDED /* Copyright (c) 2000, 2015, Oracle and/or its affiliates. - Copyright (c) 2008, 2017, MariaDB Corporation. + Copyright (c) 2008, 2020, MariaDB Corporation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -850,13 +850,17 @@ public: enum_check_fields check_level); int store(const LEX_STRING *ls, CHARSET_INFO *cs) { return store(ls->str, (uint32) ls->length, cs); } - /* +#ifdef HAVE_valgrind_or_MSAN + /** Mark unused memory in the field as defined. Mainly used to ensure that if we write full field to disk (for example in Count_distinct_field::add(), we don't write unitalized data to disk which would confuse valgrind or MSAN. */ virtual void mark_unused_memory_as_defined() {} +#else + void mark_unused_memory_as_defined() {} +#endif virtual double val_real(void)=0; virtual longlong val_int(void)=0; @@ -3250,7 +3254,9 @@ public: int store(const char *to,uint length,CHARSET_INFO *charset); int store(longlong nr, bool unsigned_val); int store(double nr) { return Field_str::store(nr); } /* QQ: To be deleted */ +#ifdef HAVE_valgrind_or_MSAN void mark_unused_memory_as_defined(); +#endif /* HAVE_valgrind_or_MSAN */ double val_real(void); longlong val_int(void); String *val_str(String*,String *); |