2019-07-16 17:24:59 +02:00
|
|
|
//===- RemarkFormat.cpp --------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Implementation of utilities to handle the different remark formats.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
#include "llvm/Remarks/RemarkFormat.h"
|
|
|
|
#include "llvm/ADT/StringSwitch.h"
|
2019-09-11 00:48:55 +02:00
|
|
|
#include "llvm/Remarks/BitstreamRemarkContainer.h"
|
2019-07-16 17:24:59 +02:00
|
|
|
|
|
|
|
using namespace llvm;
|
|
|
|
using namespace llvm::remarks;
|
|
|
|
|
|
|
|
Expected<Format> llvm::remarks::parseFormat(StringRef FormatStr) {
|
|
|
|
auto Result = StringSwitch<Format>(FormatStr)
|
|
|
|
.Cases("", "yaml", Format::YAML)
|
Reland: [Remarks] Add an LLVM-bitstream-based remark serializer
Add a new serializer, using a binary format based on the LLVM bitstream
format.
This format provides a way to serialize the remarks in two modes:
1) Separate mode: the metadata is separate from the remark entries.
2) Standalone mode: the metadata and the remark entries are in the same
file.
The format contains:
* a meta block: container version, container type, string table,
external file path, remark version
* a remark block: type, remark name, pass name, function name, debug
file, debug line, debug column, hotness, arguments (key, value, debug
file, debug line, debug column)
A string table is required for this format, which will be dumped in the
meta block to be consumed before parsing the remark blocks.
On clang itself, we noticed a size reduction of 13.4x compared to YAML,
and a compile-time reduction of between 1.7% and 3.5% on CTMark.
Differential Revision: https://reviews.llvm.org/D63466
Original llvm-svn: 367364
Revert llvm-svn: 367370
llvm-svn: 367372
2019-07-31 02:13:51 +02:00
|
|
|
.Case("yaml-strtab", Format::YAMLStrTab)
|
|
|
|
.Case("bitstream", Format::Bitstream)
|
2019-07-16 17:24:59 +02:00
|
|
|
.Default(Format::Unknown);
|
|
|
|
|
|
|
|
if (Result == Format::Unknown)
|
|
|
|
return createStringError(std::make_error_code(std::errc::invalid_argument),
|
2019-07-24 18:36:35 +02:00
|
|
|
"Unknown remark format: '%s'",
|
2019-07-16 17:24:59 +02:00
|
|
|
FormatStr.data());
|
|
|
|
|
|
|
|
return Result;
|
|
|
|
}
|
2019-09-11 00:48:55 +02:00
|
|
|
|
2019-11-08 23:30:12 +01:00
|
|
|
Expected<Format> llvm::remarks::magicToFormat(StringRef MagicStr) {
|
2019-09-11 00:48:55 +02:00
|
|
|
auto Result =
|
2019-11-08 23:30:12 +01:00
|
|
|
StringSwitch<Format>(MagicStr)
|
2019-09-11 00:48:55 +02:00
|
|
|
.StartsWith("--- ", Format::YAML) // This is only an assumption.
|
|
|
|
.StartsWith(remarks::Magic, Format::YAMLStrTab)
|
|
|
|
.StartsWith(remarks::ContainerMagic, Format::Bitstream)
|
|
|
|
.Default(Format::Unknown);
|
|
|
|
|
|
|
|
if (Result == Format::Unknown)
|
|
|
|
return createStringError(std::make_error_code(std::errc::invalid_argument),
|
2019-11-08 23:30:12 +01:00
|
|
|
"Unknown remark magic: '%s'", MagicStr.data());
|
2019-09-11 00:48:55 +02:00
|
|
|
return Result;
|
|
|
|
}
|