Skip to content

Commit 37a3c82

Browse files
authored
Merge pull request #71526 from mikeash/externalgenericmetadatabuilder-configurable-log-level
[ExternalGenericMetadataBuilder] Add configurable log levels.
2 parents fe84e61 + 6567a86 commit 37a3c82

File tree

2 files changed

+58
-19
lines changed

2 files changed

+58
-19
lines changed

lib/ExternalGenericMetadataBuilder/ExternalGenericMetadataBuilder.cpp

Lines changed: 49 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,16 @@ namespace swift {
4242
// conditional eventually. LOG_ENABLED can be used to gate work that's needed
4343
// for log statements but not for anything else.
4444
enum class LogLevel {
45-
Detail,
46-
Info,
47-
Warning,
45+
None = 0,
46+
Warning = 1,
47+
Info = 2,
48+
Detail = 3,
4849
};
49-
static const LogLevel logLevel = LogLevel::Warning;
50+
5051
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
5152
#define LOG(level, fmt, ...) \
5253
do { \
53-
if (level >= logLevel) \
54+
if (level <= getLogLevel()) \
5455
fprintf(stderr, "%s:%d:%s: " fmt "\n", METADATA_BUILDER_LOG_FILE_NAME, \
5556
__LINE__, __func__, __VA_ARGS__); \
5657
} while (0)
@@ -649,6 +650,14 @@ class ExternalGenericMetadataBuilderContext {
649650
ExternalGenericMetadataBuilderContext &
650651
operator=(const ExternalGenericMetadataBuilderContext &) = delete;
651652

653+
LogLevel getLogLevel() {
654+
return logLevel;
655+
}
656+
657+
void setLogLevel(int level) {
658+
logLevel = LogLevel(level);
659+
}
660+
652661
template <typename T>
653662
WritableData<T> allocate(size_t size) {
654663
auto atom = allocateAtom(size);
@@ -703,6 +712,7 @@ class ExternalGenericMetadataBuilderContext {
703712
void populateMachOFixups(MachOFile *file);
704713

705714
void readMachOSections(MachOFile *file);
715+
BuilderErrorOr<std::string> _mangledNominalTypeNameForBoundGenericNode(Demangle::NodePointer BoundGenericNode);
706716
BuilderErrorOr<std::optional<typename Builder::ConstructedMetadata>>
707717
constructMetadataForMangledTypeName(llvm::StringRef typeName);
708718
BuilderErrorOr<std::optional<typename Builder::ConstructedMetadata>>
@@ -720,6 +730,9 @@ class ExternalGenericMetadataBuilderContext {
720730
void writeJSONSerialization(llvm::json::OStream &J, unsigned platform,
721731
const std::string &platformVersion);
722732

733+
// The current log level.
734+
LogLevel logLevel = LogLevel::None;
735+
723736
// The architecture being targeted.
724737
std::string arch;
725738

@@ -825,6 +838,10 @@ class ReaderWriter {
825838
ReaderWriter &readerWriter;
826839
Demangle::Demangler &dem;
827840

841+
LogLevel getLogLevel() {
842+
return readerWriter.getLogLevel();
843+
}
844+
828845
public:
829846
ResolveToDemangling(ReaderWriter &readerWriter, Demangle::Demangler &dem)
830847
: readerWriter(readerWriter), dem(dem) {}
@@ -893,11 +910,18 @@ class ReaderWriter {
893910
ReaderWriter(ExternalGenericMetadataBuilderContext<Runtime> *context)
894911
: context(context) {}
895912

896-
bool isLoggingEnabled() { return true; }
913+
bool isLoggingEnabled() { return getLogLevel() >= LogLevel::Info; }
914+
915+
LogLevel getLogLevel() {
916+
return context->getLogLevel();
917+
}
897918

898919
SWIFT_FORMAT(5, 6)
899920
void log(const char *filename, unsigned line, const char *function,
900921
const char *fmt, ...) {
922+
if (!isLoggingEnabled())
923+
return;
924+
901925
va_list args;
902926
va_start(args, fmt);
903927

@@ -1826,19 +1850,7 @@ void ExternalGenericMetadataBuilderContext<Runtime>::readMachOSections(
18261850
}
18271851

18281852
template <typename Runtime>
1829-
BuilderErrorOr<std::optional<typename ExternalGenericMetadataBuilderContext<
1830-
Runtime>::Builder::ConstructedMetadata>>
1831-
ExternalGenericMetadataBuilderContext<
1832-
Runtime>::constructMetadataForMangledTypeName(llvm::StringRef typeName) {
1833-
auto node = demangleCtx.demangleTypeAsNode(typeName);
1834-
if (!node) {
1835-
return BuilderError("Failed to demangle '%s'.", typeName.str().c_str());
1836-
}
1837-
LOG(LogLevel::Detail, "Result: %s", nodeToString(node).c_str());
1838-
return constructMetadataForNode(node);
1839-
}
1840-
1841-
static BuilderErrorOr<std::string> _mangledNominalTypeNameForBoundGenericNode(
1853+
BuilderErrorOr<std::string> ExternalGenericMetadataBuilderContext<Runtime>::_mangledNominalTypeNameForBoundGenericNode(
18421854
Demangle::NodePointer BoundGenericNode) {
18431855
LOG(LogLevel::Detail, "BoundGenericNode:\n%s",
18441856
getNodeTreeAsString(BoundGenericNode).c_str());
@@ -1868,6 +1880,19 @@ static BuilderErrorOr<std::string> _mangledNominalTypeNameForBoundGenericNode(
18681880
return mangling.result();
18691881
}
18701882

1883+
template <typename Runtime>
1884+
BuilderErrorOr<std::optional<typename ExternalGenericMetadataBuilderContext<
1885+
Runtime>::Builder::ConstructedMetadata>>
1886+
ExternalGenericMetadataBuilderContext<
1887+
Runtime>::constructMetadataForMangledTypeName(llvm::StringRef typeName) {
1888+
auto node = demangleCtx.demangleTypeAsNode(typeName);
1889+
if (!node) {
1890+
return BuilderError("Failed to demangle '%s'.", typeName.str().c_str());
1891+
}
1892+
LOG(LogLevel::Detail, "Result: %s", nodeToString(node).c_str());
1893+
return constructMetadataForNode(node);
1894+
}
1895+
18711896
// Returns the constructed metadata, or no value if the node doesn't contain a
18721897
// bound generic.
18731898
template <typename Runtime>
@@ -2343,6 +2368,11 @@ void swift_externalMetadataBuilder_destroy(
23432368
delete builder;
23442369
}
23452370

2371+
void swift_externalMetadataBuilder_setLogLevel(
2372+
struct SwiftExternalMetadataBuilder *builder, int level) {
2373+
builder->withContext([&](auto *context) { context->setLogLevel(level); });
2374+
}
2375+
23462376
const char *swift_externalMetadataBuilder_readNamesJSON(
23472377
struct SwiftExternalMetadataBuilder *builder, const char *names_json) {
23482378
auto names = swift::readNames(names_json);

lib/ExternalGenericMetadataBuilder/ExternalGenericMetadataBuilder.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,15 @@ SWIFT_ATTRIBUTE_FOR_EXPORTS
5454
const char *swift_externalMetadataBuilder_readNamesJSON(
5555
struct SwiftExternalMetadataBuilder *, const char *names_json);
5656

57+
// Set the log level of the library. Accepted values are:
58+
// 0 - Only fatal errors.
59+
// 1 - Warnings.
60+
// 2 - Informational messages.
61+
// 3 - Detailed informational messages.
62+
SWIFT_ATTRIBUTE_FOR_EXPORTS
63+
void swift_externalMetadataBuilder_setLogLevel(
64+
struct SwiftExternalMetadataBuilder *, int level);
65+
5766
// Returns an error string if the dylib could not be added. The builder owns the
5867
// string, so the caller does not have to free it. The string remains valid
5968
// until at least the next call to the builder.

0 commit comments

Comments
 (0)