// Copyright 2019 The MediaPipe Authors. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef MEDIAPIPE_FRAMEWORK_DEMANGLE_H_ #define MEDIAPIPE_FRAMEWORK_DEMANGLE_H_ #ifndef MEDIAPIPE_HAS_CXA_DEMANGLE // We only support some compilers that support __cxa_demangle. // TODO: Checks if Android NDK has fixed this issue or not. #if defined(__ANDROID__) && (defined(__i386__) || defined(__x86_64__)) #define MEDIAPIPE_HAS_CXA_DEMANGLE … #elif (__GNUC__ >= 4 || (__GNUC__ >= 3 && __GNUC_MINOR__ >= 4)) && \ !defined(__mips__) #define MEDIAPIPE_HAS_CXA_DEMANGLE … #elif defined(__clang__) && !defined(_MSC_VER) #define MEDIAPIPE_HAS_CXA_DEMANGLE … #else #define MEDIAPIPE_HAS_CXA_DEMANGLE … #endif #endif #include <stdlib.h> #include <string> #if MEDIAPIPE_HAS_CXA_DEMANGLE #include <cxxabi.h> #endif namespace mediapipe { // Demangle a mangled symbol name and return the demangled name. // If 'mangled' isn't mangled in the first place, this function // simply returns 'mangled' as is. // // This function is used for demangling mangled symbol names such as // '_Z3bazifdPv'. It uses abi::__cxa_demangle() if your compiler has // the API. Otherwise, this function simply returns 'mangled' as is. // // Currently, we support only GCC 3.4.x or later for the following // reasons. // // - GCC 2.95.3 doesn't have cxxabi.h // - GCC 3.3.5 and ICC 9.0 have a bug. Their abi::__cxa_demangle() // returns junk values for non-mangled symbol names (ex. function // names in C linkage). For example, // abi::__cxa_demangle("main", 0, 0, &status) // returns "unsigned long" and the status code is 0 (successful). // // Also, // // - MIPS is not supported because abi::__cxa_demangle() is not defined. // - Android x86 is not supported because STLs don't define __cxa_demangle // // Prefer using MediaPipeTypeStringOrDemangled<T>() when possible (defined // in type_map.h). inline std::string Demangle(const char* mangled) { … } } // namespace mediapipe #endif // MEDIAPIPE_FRAMEWORK_DEMANGLE_H_