Commit c117c2c8 authored by Nick Desaulniers's avatar Nick Desaulniers
Browse files

[Demangle] make llvm::demangle take std::string_view rather than const std::string&

As suggested by @erichkeane in
https://reviews.llvm.org/D141451#inline-1429549

There's potential for a lot more cleanups around these APIs. This is
just a start.

Callers need to be more careful about sub-expressions producing strings
that don't outlast the expression using ``llvm::demangle``. Add a
release note.

Reviewed By: MaskRay, #lld-macho

Differential Revision: https://reviews.llvm.org/D149104
parent 1f74964b
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -633,9 +633,8 @@ BackendConsumer::StackSizeDiagHandler(const llvm::DiagnosticInfoStackSize &D) {
    return false;

  Diags.Report(*Loc, diag::warn_fe_frame_larger_than)
      << D.getStackSize()
      << D.getStackLimit()
      << llvm::demangle(D.getFunction().getName().str());
      << D.getStackSize() << D.getStackLimit()
      << llvm::demangle(D.getFunction().getName());
  return true;
}

@@ -649,7 +648,7 @@ bool BackendConsumer::ResourceLimitDiagHandler(

  Diags.Report(*Loc, DiagID)
      << D.getResourceName() << D.getResourceSize() << D.getResourceLimit()
      << llvm::demangle(D.getFunction().getName().str());
      << llvm::demangle(D.getFunction().getName());
  return true;
}

@@ -854,7 +853,7 @@ void BackendConsumer::DontCallDiagHandler(const DiagnosticInfoDontCall &D) {
  Diags.Report(LocCookie, D.getSeverity() == DiagnosticSeverity::DS_Error
                              ? diag::err_fe_backend_error_attr
                              : diag::warn_fe_backend_warning_attr)
      << llvm::demangle(D.getFunctionName().str()) << D.getNote();
      << llvm::demangle(D.getFunctionName()) << D.getNote();
}

void BackendConsumer::MisExpectDiagHandler(
+2 −2
Original line number Diff line number Diff line
@@ -38,9 +38,9 @@ static std::string maybeDemangleSymbol(const COFFLinkerContext &ctx,
    StringRef demangleInput = prefixless;
    if (ctx.config.machine == I386)
      demangleInput.consume_front("_");
    std::string demangled = demangle(demangleInput.str());
    std::string demangled = demangle(demangleInput);
    if (demangled != demangleInput)
      return prefix + demangle(demangleInput.str());
      return prefix + demangled;
    return (prefix + prefixless).str();
  }
  return std::string(symName);
+9 −6
Original line number Diff line number Diff line
@@ -145,13 +145,16 @@ StringMap<SmallVector<Symbol *, 0>> &SymbolTable::getDemangledSyms() {
      if (canBeVersioned(*sym)) {
        StringRef name = sym->getName();
        size_t pos = name.find('@');
        std::string substr;
        if (pos == std::string::npos)
          demangled = demangle(name.str());
        else if (pos + 1 == name.size() || name[pos + 1] == '@')
          demangled = demangle(name.substr(0, pos).str());
        else
          demangled =
              (demangle(name.substr(0, pos).str()) + name.substr(pos)).str();
          demangled = demangle(name);
        else if (pos + 1 == name.size() || name[pos + 1] == '@') {
          substr = name.substr(0, pos);
          demangled = demangle(substr);
        } else {
          substr = name.substr(0, pos);
          demangled = (demangle(substr) + name.substr(pos)).str();
        }
        (*demangledSyms)[demangled].push_back(sym);
      }
  }
+1 −3
Original line number Diff line number Diff line
@@ -45,9 +45,7 @@ LLVM_ATTRIBUTE_UNUSED static inline void assertSymbols() {

// Returns a symbol for an error message.
static std::string maybeDemangleSymbol(StringRef symName) {
  if (elf::config->demangle)
    return demangle(symName.str());
  return symName.str();
  return elf::config->demangle ? demangle(symName.str()) : symName.str();
}

std::string lld::toString(const elf::Symbol &sym) {
+1 −1
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ static_assert(sizeof(SymbolUnion) == sizeof(Defined),
static std::string maybeDemangleSymbol(StringRef symName) {
  if (config->demangle) {
    symName.consume_front("_");
    return demangle(symName.str());
    return demangle(symName);
  }
  return symName.str();
}
Loading