================ @@ -0,0 +1,58 @@ +//===--- DirectToIndirectFCR.h - RISC-V specific pass ---------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#pragma once + +#include "lldb/lldb-types.h" + +#include "llvm/IR/Instructions.h" +#include "llvm/Pass.h" + +namespace lldb_private { + +class ExecutionContext; + +// During the lldb expression execution lldb wraps a user expression, jittes +// fabricated code and then puts it into the stack memory. Thus, if user tried ---------------- dlav-sc wrote:
Well, lldb generates its own code that wraps expression, something like: ``` #line 1 "<lldb wrapper prefix>" #ifndef offsetof #define offsetof(t, d) __builtin_offsetof(t, d) #endif #ifndef NULL #define NULL (__null) #endif #ifndef Nil #define Nil (__null) #endif #ifndef nil #define nil (__null) #endif #ifndef YES #define YES ((BOOL)1) #endif #ifndef NO #define NO ((BOOL)0) #endif typedef __INT8_TYPE__ int8_t; typedef __UINT8_TYPE__ uint8_t; typedef __INT16_TYPE__ int16_t; typedef __UINT16_TYPE__ uint16_t; typedef __INT32_TYPE__ int32_t; typedef __UINT32_TYPE__ uint32_t; typedef __INT64_TYPE__ int64_t; typedef __UINT64_TYPE__ uint64_t; typedef __INTPTR_TYPE__ intptr_t; typedef __UINTPTR_TYPE__ uintptr_t; typedef __SIZE_TYPE__ size_t; typedef __PTRDIFF_TYPE__ ptrdiff_t; typedef unsigned short unichar; extern "C" { int printf(const char * __restrict, ...); } typedef signed char BOOL; void $__lldb_expr(void *$__lldb_arg) { ; #line 1 "<user expression 0>" foo() ; #line 1 "<lldb wrapper suffix>" } ``` So lldb have to puts this code somewhere, resolves relocations and executes. I have no idea where lldb can place the code except of the stack. I've checked that on x86 lldb does the same: ``` lldb IRMemoryMap::Malloc (79, 0x10, 0x6, eAllocationPolicyProcessOnly) -> 0x7ffff7fc7040 lldb IRMemoryMap::Malloc (1, 0x1, 0x2, eAllocationPolicyProcessOnly) -> 0x7ffff7fc8450 lldb IRMemoryMap::Malloc (102, 0x1, 0x2, eAllocationPolicyProcessOnly) -> 0x7ffff7fc8460 lldb IRMemoryMap::Malloc (7, 0x4, 0x6, eAllocationPolicyProcessOnly) -> 0x7ffff7fc7090 lldb IRMemoryMap::Malloc (31, 0x8, 0x2, eAllocationPolicyProcessOnly) -> 0x7ffff7fc84d0 lldb IRMemoryMap::Malloc (111, 0x1, 0x2, eAllocationPolicyProcessOnly) -> 0x7ffff7fc84f0 lldb IRMemoryMap::Malloc (1, 0x1, 0x2, eAllocationPolicyProcessOnly) -> 0x7ffff7fc8560 lldb IRMemoryMap::Malloc (103, 0x8, 0x2, eAllocationPolicyProcessOnly) -> 0x7ffff7fc8570 ``` ``` lldb Function disassembly: 0x7ffff7fc7040: 55 other pushq %rbp 0x7ffff7fc7041: 48 89 e5 other movq %rsp, %rbp 0x7ffff7fc7044: 53 other pushq %rbx 0x7ffff7fc7045: 50 other pushq %rax 0x7ffff7fc7046: 48 89 fb other movq %rdi, %rbx 0x7ffff7fc7049: 48 8d 7d f0 other leaq -0x10(%rbp), %rdi 0x7ffff7fc704d: 48 b9 00 70 fc f7 ff 7f 00 00 other movabsq $0x7ffff7fc7000, %rcx ; imm = 0x7FFFF7FC7000 0x7ffff7fc7057: b0 00 other movb $0x0, %al 0x7ffff7fc7059: ff d1 call callq *%rcx 0x7ffff7fc705b: 48 89 5d f0 other movq %rbx, -0x10(%rbp) 0x7ffff7fc705f: 48 b8 29 51 55 55 55 55 00 00 other movabsq $0x555555555129, %rax ; imm = 0x555555555129 0x7ffff7fc7069: ff d0 call callq *%rax 0x7ffff7fc706b: 48 83 c4 08 other addq $0x8, %rsp 0x7ffff7fc706f: 5b other popq %rbx 0x7ffff7fc7070: 5d other popq %rbp 0x7ffff7fc7071: c3 return retq ``` https://github.com/llvm/llvm-project/pull/99336 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits