diff --git a/artiq/compiler/targets.py b/artiq/compiler/targets.py index a6b7c447b..a82449fd1 100644 --- a/artiq/compiler/targets.py +++ b/artiq/compiler/targets.py @@ -196,7 +196,7 @@ class Target: # the backtrace entry should point at. offset_addresses = [hex(addr - 1) for addr in addresses] with RunTool([self.triple + "-addr2line", "--addresses", "--functions", "--inlines", - "--exe={library}"] + offset_addresses, + "--demangle", "--exe={library}"] + offset_addresses, library=library) \ as results: lines = iter(results["__stdout__"].rstrip().split("\n")) @@ -221,6 +221,10 @@ class Target: backtrace.append((filename, int(line), -1, function, address)) return backtrace + def demangle(self, names): + with RunTool([self.triple + "-c++filt"] + names) as results: + return results["__stdout__"].rstrip().split("\n") + class NativeTarget(Target): def __init__(self): super().__init__() diff --git a/artiq/coredevice/comm_generic.py b/artiq/coredevice/comm_generic.py index cca4a9573..2687ef38e 100644 --- a/artiq/coredevice/comm_generic.py +++ b/artiq/coredevice/comm_generic.py @@ -504,7 +504,7 @@ class CommGeneric: self._write_flush() - def _serve_exception(self, object_map, symbolizer): + def _serve_exception(self, object_map, symbolizer, demangler): name = self._read_string() message = self._read_string() params = [self._read_int64() for _ in range(3)] @@ -517,7 +517,7 @@ class CommGeneric: backtrace = [self._read_int32() for _ in range(self._read_int32())] traceback = list(reversed(symbolizer(backtrace))) + \ - [(filename, line, column, function, None)] + [(filename, line, column, *demangler([function]), None)] core_exn = exceptions.CoreException(name, message, params, traceback) if core_exn.id == 0: @@ -529,13 +529,13 @@ class CommGeneric: python_exn.artiq_core_exception = core_exn raise python_exn - def serve(self, object_map, symbolizer): + def serve(self, object_map, symbolizer, demangler): while True: self._read_header() if self._read_type == _D2HMsgType.RPC_REQUEST: self._serve_rpc(object_map) elif self._read_type == _D2HMsgType.KERNEL_EXCEPTION: - self._serve_exception(object_map, symbolizer) + self._serve_exception(object_map, symbolizer, demangler) elif self._read_type == _D2HMsgType.WATCHDOG_EXPIRED: raise exceptions.WatchdogExpired elif self._read_type == _D2HMsgType.CLOCK_FAILURE: diff --git a/artiq/coredevice/core.py b/artiq/coredevice/core.py index 9ac755b34..035dac8e8 100644 --- a/artiq/coredevice/core.py +++ b/artiq/coredevice/core.py @@ -92,7 +92,8 @@ class Core: stripped_library = target.strip(library) return stitcher.object_map, stripped_library, \ - lambda addresses: target.symbolize(library, addresses) + lambda addresses: target.symbolize(library, addresses), \ + lambda symbols: target.demangle(symbols) except diagnostic.Error as error: raise CompileError(error.diagnostic) from error @@ -102,7 +103,8 @@ class Core: nonlocal result result = new_result - object_map, kernel_library, symbolizer = self.compile(function, args, kwargs, set_result) + object_map, kernel_library, symbolizer, demangler = \ + self.compile(function, args, kwargs, set_result) if self.first_run: self.comm.check_ident() @@ -111,7 +113,7 @@ class Core: self.comm.load(kernel_library) self.comm.run() - self.comm.serve(object_map, symbolizer) + self.comm.serve(object_map, symbolizer, demangler) return result