0%

coro-asm 环境配置

这一篇介绍工程及环境配置

1
2
gcc version 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04)
Description: Ubuntu 24.04 LTS

cmake 工程

  • why -fno-exceptions: 异常安全会在协程里插入一些处理代码,影响理解
  • why -O1: O0会产生很多冗余的指令,没有O1看着干净。当然我们也需要某些地方不加优化,参见 gcc 禁止优化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cmake_minimum_required(VERSION 3.10)

set(${CMAKE_HOST_SYSTEM_NAME} TRUE)
set(CMAKE_CXX_STANDARD 20)

project(TEST)
aux_source_directory(. SRCS)

if(Linux)
add_compile_options(-fcoroutines)
message(CMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG})
set(CMAKE_CXX_FLAGS_DEBUG "-O1 -g -fno-exceptions")
# add_link_options("-T" "${CMAKE_CURRENT_LIST_DIR}/ls.ld")
endif()

include_directories(.)

foreach(src ${SRCS})
string(REGEX REPLACE ".*/([^/\\]*)\.cpp" "\\1" name "${src}")
message("src=${src} name=${name}")
add_executable(${name} ${src})
endforeach()

调试

随意,但qtcreator的视图蛮不错(设置operator on instruction的快捷键),当然vscode也可以
vscode asm debug
qtcreator asm debug

utils

gcc 禁止优化

1
2
3
4
#pragma GCC                    push_options
#pragma GCC optimize("O0")
extern "C" FORCE_NOINLINE void TagFunc(int){}
#pragma GCC pop_options

我们将使用这个函数,作为代码间的tag,建立源码与汇编码之间的节点映射,如下使用

1
TagFunc(2);

这将被编译成
1
2
mov 0x02, %rdi
call TagFunc

utils.hpp code

1
2
3
4
5
6
7
// utils.hpp
#pragma once
#include <stdio.h>
#define FORCE_NOINLINE __attribute__((noinline))
#define LOG(...) printf(__VA_ARGS__)
#define WLOG(...) wfprintf(__VA_ARGS__)