Actual source code: demangle.cxx

      1: #if !defined(PETSC_SKIP_COMPLEX)
      2:   #define PETSC_SKIP_COMPLEX
      3: #endif
      4: #include <petscsys.h>
      5: #include <petsc/private/petscimpl.h>

      7: #if defined(PETSC_HAVE_CXXABI_H)
      8:   #include <cxxabi.h>
      9: #endif

     11: PetscErrorCode PetscDemangleSymbol(const char mangledName[], char **name)
     12: {
     13:   PetscFunctionBegin;
     14:   if (mangledName) PetscAssertPointer(mangledName, 1);
     15:   PetscAssertPointer(name, 2);

     17:   *name = nullptr;
     18:   if (!mangledName) PetscFunctionReturn(PETSC_SUCCESS);
     19: #if defined(PETSC_HAVE_CXXABI_H)
     20:   char *newname;
     21:   int   status;

     23:   newname = __cxxabiv1::__cxa_demangle(mangledName, nullptr, nullptr, &status);
     24:   if (status) {
     25:     PetscCheck(status != -1, PETSC_COMM_SELF, PETSC_ERR_MEM, "Failed to allocate memory for symbol %s", mangledName);
     26:     PetscCheck(status == -2, PETSC_COMM_SELF, PETSC_ERR_LIB, "Demangling failed for symbol %s", mangledName);
     27:     /* Mangled name is not a valid name under the C++ ABI mangling rules */
     28:     PetscCall(PetscStrallocpy(mangledName, name));
     29:     PetscFunctionReturn(PETSC_SUCCESS);
     30:   }
     31:   PetscCall(PetscStrallocpy(newname, name));
     32:   free(newname);
     33: #else
     34:   PetscCall(PetscStrallocpy(mangledName, name));
     35: #endif
     36:   PetscFunctionReturn(PETSC_SUCCESS);
     37: }