blob: 31ea37d2a4187c0f924ef4d36ac32dc857ae24ca [file] [log] [blame]
# Copyright (C) 2022 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
from typing import List, Union
from typing import Optional
from python.generators.trace_processor_table.public import Alias
from python.generators.trace_processor_table.public import ColumnFlag
from python.generators.trace_processor_table.util import ParsedTable
from python.generators.trace_processor_table.util import ParsedColumn
from python.generators.trace_processor_table.util import data_layer_type
from python.generators.trace_processor_table.util import parse_type
from python.generators.trace_processor_table.util import typed_column_type
from python.generators.trace_processor_table.serialize_new import TableSerializer as NewTableSerializer
def serialize_header(ifdef_guard: str, tables: List[ParsedTable],
include_paths: List[str]) -> str:
"""Serializes a table header file containing the given set of tables."""
# Replace the backslash with forward slash when building on Windows.
# Caused b/327985369 without the replace.
include_paths_str = '\n'.join([f'#include "{i}"' for i in include_paths
]).replace("\\", "/")
serializers: List[NewTableSerializer] = []
for t in tables:
serializers.append(NewTableSerializer(t))
tables_str = '\n\n'.join([t.serialize() for t in serializers])
return f'''
#ifndef {ifdef_guard}
#define {ifdef_guard}
#include <array>
#include <cstddef>
#include <cstdint>
#include <memory>
#include <optional>
#include <tuple>
#include <type_traits>
#include <utility>
#include <variant>
#include <vector>
#include "perfetto/base/compiler.h"
#include "perfetto/base/logging.h"
#include "perfetto/public/compiler.h"
#include "perfetto/trace_processor/basic_types.h"
#include "perfetto/trace_processor/ref_counted.h"
#include "src/trace_processor/dataframe/dataframe.h"
#include "src/trace_processor/dataframe/specs.h"
#include "src/trace_processor/dataframe/typed_cursor.h"
#include "src/trace_processor/tables/macros_internal.h"
{include_paths_str}
namespace perfetto::trace_processor::tables {{
{tables_str.strip()}
}} // namespace perfetto
#endif // {ifdef_guard}
'''.strip()
def to_cpp_flags(raw_flag: ColumnFlag) -> str:
"""Converts a ColumnFlag to the C++ flags which it represents
It is not valid to call this function with ColumnFlag.NONE as in this case
defaults for that column should be implicitly used."""
assert raw_flag != ColumnFlag.NONE
flags = []
if ColumnFlag.SORTED in raw_flag:
flags.append('ColumnLegacy::Flag::kSorted')
if ColumnFlag.HIDDEN in raw_flag:
flags.append('ColumnLegacy::Flag::kHidden')
if ColumnFlag.DENSE in raw_flag:
flags.append('ColumnLegacy::Flag::kDense')
if ColumnFlag.SET_ID in raw_flag:
flags.append('ColumnLegacy::Flag::kSetId')
return ' | '.join(flags)