@@ -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.
4444enum 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
18281852template <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.
18731898template <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+
23462376const char *swift_externalMetadataBuilder_readNamesJSON (
23472377 struct SwiftExternalMetadataBuilder *builder, const char *names_json) {
23482378 auto names = swift::readNames (names_json);
0 commit comments