All the sources of `llvm-min-tblgen` are also used for `llvm-tblgen`, with identical compilation flags. Reuse the object files of `llvm-min-tblgen` for `llvm-tblgen` by applying the usual source structure of an executable: One file per executable which named after the executable name containing the (in this case trivial) main function, which just calls the tblgen_main in TableGen.cpp. This should also clear up any confusion (including mine) of where each executable's main function is. While this slightly reduces build time, the main motivation is ccache. Using the hard_link option, building the object files for `llvm-tblgen` will result in a hard link to the same object file already used for `llvm-min-tblgen`. To signal the build system that the file is new, ccache will update the file's time stamp. Unfortunately, time stamps are shared between all hard-linked files s.t. this will indirectly also update the time stamps for the object files used for `llvm-tblgen`. At the next run, Ninja will recognize this time stamp discrepancy to the expected stamp recorded in `.ninja_log` and rebuild those object files for `llvm-min-tblgen`, which again will also update the stamp for the `llvm-tblgen`... . This is especially annoying for tablegen because it means Ninja will re-run all tablegenning in every build. I am using the hard_link option because it reduces the cost of having multiple build-trees of the LLVM sources and reduces the wear to the SSD they are stored on.
100 lines
3.6 KiB
C++
100 lines
3.6 KiB
C++
//===- TableGen.cpp - Top-Level TableGen implementation for LLVM ----------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file contains the global defintions (mostly command line parameters)
|
|
// shared between llvm-tblgen and llvm-min-tblgen.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "TableGen.h"
|
|
#include "llvm/ADT/StringRef.h"
|
|
#include "llvm/Support/CommandLine.h"
|
|
#include "llvm/Support/InitLLVM.h"
|
|
#include "llvm/Support/raw_ostream.h"
|
|
#include "llvm/TableGen/Main.h"
|
|
#include "llvm/TableGen/Record.h"
|
|
#include "llvm/TableGen/SetTheory.h"
|
|
#include "llvm/TableGen/TableGenBackend.h"
|
|
#include <cassert>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
cl::opt<bool> EmitLongStrLiterals(
|
|
"long-string-literals",
|
|
cl::desc("when emitting large string tables, prefer string literals over "
|
|
"comma-separated char literals. This can be a readability and "
|
|
"compile-time performance win, but upsets some compilers"),
|
|
cl::Hidden, cl::init(true));
|
|
} // end namespace llvm
|
|
|
|
static cl::OptionCategory PrintEnumsCat("Options for -print-enums");
|
|
static cl::opt<std::string> Class("class",
|
|
cl::desc("Print Enum list for this class"),
|
|
cl::value_desc("class name"),
|
|
cl::cat(PrintEnumsCat));
|
|
|
|
static void printRecords(const RecordKeeper &Records, raw_ostream &OS) {
|
|
OS << Records; // No argument, dump all contents
|
|
}
|
|
|
|
static void printEnums(const RecordKeeper &Records, raw_ostream &OS) {
|
|
for (const Record *Rec : Records.getAllDerivedDefinitions(Class))
|
|
OS << Rec->getName() << ", ";
|
|
OS << "\n";
|
|
}
|
|
|
|
static void printSets(const RecordKeeper &Records, raw_ostream &OS) {
|
|
SetTheory Sets;
|
|
Sets.addFieldExpander("Set", "Elements");
|
|
for (const Record *Rec : Records.getAllDerivedDefinitions("Set")) {
|
|
OS << Rec->getName() << " = [";
|
|
const std::vector<const Record *> *Elts = Sets.expand(Rec);
|
|
assert(Elts && "Couldn't expand Set instance");
|
|
for (const Record *Elt : *Elts)
|
|
OS << ' ' << Elt->getName();
|
|
OS << " ]\n";
|
|
}
|
|
}
|
|
|
|
static TableGen::Emitter::Opt X[] = {
|
|
{"print-records", printRecords, "Print all records to stdout (default)",
|
|
true},
|
|
{"print-detailed-records", EmitDetailedRecords,
|
|
"Print full details of all records to stdout"},
|
|
{"null-backend", [](const RecordKeeper &Records, raw_ostream &OS) {},
|
|
"Do nothing after parsing (useful for timing)"},
|
|
{"dump-json", EmitJSON, "Dump all records as machine-readable JSON"},
|
|
{"print-enums", printEnums, "Print enum values for a class"},
|
|
{"print-sets", printSets, "Print expanded sets for testing DAG exprs"},
|
|
};
|
|
|
|
int tblgen_main(int argc, char **argv) {
|
|
InitLLVM X(argc, argv);
|
|
cl::ParseCommandLineOptions(argc, argv);
|
|
|
|
return TableGenMain(argv[0]);
|
|
}
|
|
|
|
#ifndef __has_feature
|
|
#define __has_feature(x) 0
|
|
#endif
|
|
|
|
#if __has_feature(address_sanitizer) || \
|
|
(defined(__SANITIZE_ADDRESS__) && defined(__GNUC__)) || \
|
|
__has_feature(leak_sanitizer)
|
|
|
|
#include <sanitizer/lsan_interface.h>
|
|
// Disable LeakSanitizer for this binary as it has too many leaks that are not
|
|
// very interesting to fix. See compiler-rt/include/sanitizer/lsan_interface.h .
|
|
LLVM_ATTRIBUTE_USED int __lsan_is_turned_off() { return 1; }
|
|
|
|
#endif
|