• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 //! rustc demangle for Rust.
17 
18 #![feature(rustc_private)]
19 extern crate rustc_demangle;
20 
21 use std::alloc::{GlobalAlloc, Layout, System};
22 use std::io::Write;
23 use std::os::raw::{c_char};
24 use std::ptr;
25 use std::result::Result::{Ok, Err};
26 
27 /// # Safety
28 ///
29 /// C-style interface for demangling.
30 #[no_mangle]
rustc_demangle(mangled: *const c_char) -> *mut c_char31 pub unsafe extern "C" fn rustc_demangle(mangled: *const c_char) -> *mut c_char
32 {
33     if mangled.is_null() {
34         return ptr::null_mut();
35     }
36     let mangled_str = match std::ffi::CStr::from_ptr(mangled).to_str() {
37         Ok(s) => s,
38         Err(_) => return ptr::null_mut(),
39     };
40 
41     match rustc_demangle::try_demangle(mangled_str) {
42         Ok(demangle) => {
43             let size = demangle.to_string().len();
44             let out = unsafe { System.alloc_zeroed(Layout::from_size_align_unchecked(size, 1)) };
45             if out.is_null() {
46                 return ptr::null_mut();
47             }
48 
49             match write!(unsafe { std::slice::from_raw_parts_mut(out, size) }, "{:#}\0", demangle) {
50                 Ok(_) => {
51                     unsafe { std::slice::from_raw_parts_mut(out, size) }.as_mut_ptr() as *mut c_char
52                 }
53                 Err(_) => ptr::null_mut(),
54             }
55         }
56         Err(_) => ptr::null_mut(),
57     }
58 }
59