@@ -42,15 +42,16 @@ namespace swift {
42
42
// conditional eventually. LOG_ENABLED can be used to gate work that's needed
43
43
// for log statements but not for anything else.
44
44
enum class LogLevel {
45
- Detail,
46
- Info,
47
- Warning,
45
+ None = 0 ,
46
+ Warning = 1 ,
47
+ Info = 2 ,
48
+ Detail = 3 ,
48
49
};
49
- static const LogLevel logLevel = LogLevel::Warning;
50
+
50
51
#pragma clang diagnostic ignored "-Wgnu-zero-variadic-macro-arguments"
51
52
#define LOG (level, fmt, ...) \
52
53
do { \
53
- if (level >= logLevel) \
54
+ if (level <= getLogLevel ()) \
54
55
fprintf (stderr, " %s:%d:%s: " fmt " \n " , METADATA_BUILDER_LOG_FILE_NAME, \
55
56
__LINE__, __func__, __VA_ARGS__); \
56
57
} while (0 )
@@ -649,6 +650,14 @@ class ExternalGenericMetadataBuilderContext {
649
650
ExternalGenericMetadataBuilderContext &
650
651
operator =(const ExternalGenericMetadataBuilderContext &) = delete ;
651
652
653
+ LogLevel getLogLevel () {
654
+ return logLevel;
655
+ }
656
+
657
+ void setLogLevel (int level) {
658
+ logLevel = LogLevel (level);
659
+ }
660
+
652
661
template <typename T>
653
662
WritableData<T> allocate (size_t size) {
654
663
auto atom = allocateAtom (size);
@@ -703,6 +712,7 @@ class ExternalGenericMetadataBuilderContext {
703
712
void populateMachOFixups (MachOFile *file);
704
713
705
714
void readMachOSections (MachOFile *file);
715
+ BuilderErrorOr<std::string> _mangledNominalTypeNameForBoundGenericNode (Demangle::NodePointer BoundGenericNode);
706
716
BuilderErrorOr<std::optional<typename Builder::ConstructedMetadata>>
707
717
constructMetadataForMangledTypeName (llvm::StringRef typeName);
708
718
BuilderErrorOr<std::optional<typename Builder::ConstructedMetadata>>
@@ -720,6 +730,9 @@ class ExternalGenericMetadataBuilderContext {
720
730
void writeJSONSerialization (llvm::json::OStream &J, unsigned platform,
721
731
const std::string &platformVersion);
722
732
733
+ // The current log level.
734
+ LogLevel logLevel = LogLevel::None;
735
+
723
736
// The architecture being targeted.
724
737
std::string arch;
725
738
@@ -825,6 +838,10 @@ class ReaderWriter {
825
838
ReaderWriter &readerWriter;
826
839
Demangle::Demangler &dem;
827
840
841
+ LogLevel getLogLevel () {
842
+ return readerWriter.getLogLevel ();
843
+ }
844
+
828
845
public:
829
846
ResolveToDemangling (ReaderWriter &readerWriter, Demangle::Demangler &dem)
830
847
: readerWriter(readerWriter), dem(dem) {}
@@ -893,11 +910,18 @@ class ReaderWriter {
893
910
ReaderWriter (ExternalGenericMetadataBuilderContext<Runtime> *context)
894
911
: context(context) {}
895
912
896
- bool isLoggingEnabled () { return true ; }
913
+ bool isLoggingEnabled () { return getLogLevel () >= LogLevel::Info; }
914
+
915
+ LogLevel getLogLevel () {
916
+ return context->getLogLevel ();
917
+ }
897
918
898
919
SWIFT_FORMAT (5 , 6 )
899
920
void log (const char *filename, unsigned line, const char *function,
900
921
const char *fmt, ...) {
922
+ if (!isLoggingEnabled ())
923
+ return ;
924
+
901
925
va_list args;
902
926
va_start (args, fmt);
903
927
@@ -1826,19 +1850,7 @@ void ExternalGenericMetadataBuilderContext<Runtime>::readMachOSections(
1826
1850
}
1827
1851
1828
1852
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(
1842
1854
Demangle::NodePointer BoundGenericNode) {
1843
1855
LOG (LogLevel::Detail, " BoundGenericNode:\n %s" ,
1844
1856
getNodeTreeAsString (BoundGenericNode).c_str ());
@@ -1868,6 +1880,19 @@ static BuilderErrorOr<std::string> _mangledNominalTypeNameForBoundGenericNode(
1868
1880
return mangling.result ();
1869
1881
}
1870
1882
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
+
1871
1896
// Returns the constructed metadata, or no value if the node doesn't contain a
1872
1897
// bound generic.
1873
1898
template <typename Runtime>
@@ -2343,6 +2368,11 @@ void swift_externalMetadataBuilder_destroy(
2343
2368
delete builder;
2344
2369
}
2345
2370
2371
+ void swift_externalMetadataBuilder_setLogLevel (
2372
+ struct SwiftExternalMetadataBuilder *builder, int level) {
2373
+ builder->withContext ([&](auto *context) { context->setLogLevel (level); });
2374
+ }
2375
+
2346
2376
const char *swift_externalMetadataBuilder_readNamesJSON (
2347
2377
struct SwiftExternalMetadataBuilder *builder, const char *names_json) {
2348
2378
auto names = swift::readNames (names_json);
0 commit comments