+static bool shouldSkip(uint32_t Symflags) {
+ if (!(Symflags & object::BasicSymbolRef::SF_Global))
+ return true;
+ if (Symflags & object::BasicSymbolRef::SF_FormatSpecific)
+ return true;
+ return false;
+}
+
+static void diagnosticHandler(const DiagnosticInfo &DI) {
+ if (const auto *BDI = dyn_cast<BitcodeDiagnosticInfo>(&DI)) {
+ std::error_code EC = BDI->getError();
+ if (EC == BitcodeError::InvalidBitcodeSignature)
+ return;
+ }
+
+ std::string ErrStorage;
+ {
+ raw_string_ostream OS(ErrStorage);
+ DiagnosticPrinterRawOStream DP(OS);
+ DI.print(DP);
+ }
+ ld_plugin_level Level;
+ switch (DI.getSeverity()) {
+ case DS_Error:
+ message(LDPL_FATAL, "LLVM gold plugin has failed to create LTO module: %s",
+ ErrStorage.c_str());
+ llvm_unreachable("Fatal doesn't return.");
+ case DS_Warning:
+ Level = LDPL_WARNING;
+ break;
+ case DS_Note:
+ case DS_Remark:
+ Level = LDPL_INFO;
+ break;
+ }
+ message(Level, "LLVM gold plugin: %s", ErrStorage.c_str());
+}
+
+static void diagnosticHandlerForContext(const DiagnosticInfo &DI,
+ void *Context) {
+ diagnosticHandler(DI);
+}
+
+static GlobalValue::VisibilityTypes
+getMinVisibility(GlobalValue::VisibilityTypes A,
+ GlobalValue::VisibilityTypes B) {
+ if (A == GlobalValue::HiddenVisibility)
+ return A;
+ if (B == GlobalValue::HiddenVisibility)
+ return B;
+ if (A == GlobalValue::ProtectedVisibility)
+ return A;
+ return B;
+}
+