From 2b34c4774cd0e0433719d783ef43de30ada10fcc Mon Sep 17 00:00:00 2001 From: Yingchi Long Date: Wed, 11 Sep 2024 20:13:29 +0800 Subject: [PATCH] chromium: debug skia-segfault --- src/chromium.ts | 9 ++- src/chromium/skia-segfault.ts | 4 ++ src/chromium/skia-segfault/compare.ts | 18 ++++++ src/chromium/skia-segfault/extract.ts | 67 +++++++++++++++++++++ src/chromium/skia-segfault/replaceObject.ts | 23 +++++++ 5 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 src/chromium/skia-segfault.ts create mode 100644 src/chromium/skia-segfault/compare.ts create mode 100644 src/chromium/skia-segfault/extract.ts create mode 100644 src/chromium/skia-segfault/replaceObject.ts diff --git a/src/chromium.ts b/src/chromium.ts index 5160e8a..f07fc75 100644 --- a/src/chromium.ts +++ b/src/chromium.ts @@ -8,4 +8,11 @@ import { local } from './environment/index.js'; /** * Local directory for chromium - related debugging. */ -export const dir = path.resolve(local, 'chromium') \ No newline at end of file +export const dir = path.resolve(local, 'chromium') + +export const chromiumSource = '/home/lyc/swchromium-102.0.5005.115'; + +/** + * Vendored executable binary of "gn" executable. + */ +export const gnExe = path.resolve(chromiumSource, 'buildtools', 'linux64', 'gn-linux-sw64'); \ No newline at end of file diff --git a/src/chromium/skia-segfault.ts b/src/chromium/skia-segfault.ts new file mode 100644 index 0000000..0142c8b --- /dev/null +++ b/src/chromium/skia-segfault.ts @@ -0,0 +1,4 @@ +import path from 'path'; +import * as chromium from '../chromium.js' + +export const dir = path.resolve(chromium.dir, 'skia-segfault'); \ No newline at end of file diff --git a/src/chromium/skia-segfault/compare.ts b/src/chromium/skia-segfault/compare.ts new file mode 100644 index 0000000..02f8dc3 --- /dev/null +++ b/src/chromium/skia-segfault/compare.ts @@ -0,0 +1,18 @@ +import { spawn } from 'child_process'; +import path from 'path'; +import { promisifySpawn } from '../../cli.js'; +import { dir } from '../skia-segfault.js'; +import { chromiumSource } from '../../chromium.js'; + +const chromiumBuild = path.resolve( + chromiumSource, + 'out', + 'c9094783eb43868cdbcf26b3266b0231d8fbd6e6', + 'Release', +) + +await promisifySpawn(spawn('code-oss', [ + "--diff", + path.resolve(chromiumBuild, 'SkOpts.PU3.s'), + path.resolve(dir, 'extract.s'), +])) \ No newline at end of file diff --git a/src/chromium/skia-segfault/extract.ts b/src/chromium/skia-segfault/extract.ts new file mode 100644 index 0000000..778c584 --- /dev/null +++ b/src/chromium/skia-segfault/extract.ts @@ -0,0 +1,67 @@ +/** + * Try to extract skia SkOpts.ll + */ + +import { spawn } from 'child_process'; +import { llvmToolchain } from '../../toolchain/index.js'; +import * as compiler from '../../commands/compiler.js'; +import path from 'path'; +import { promisifySpawn } from '../../cli.js'; +import fs from 'fs'; +import { dir } from '../skia-segfault.js'; + +const tc = llvmToolchain('/tmp/llvm-ly-install/c9094783eb43868cdbcf26b3266b0231d8fbd6e6'); + +const extractProcess = spawn(tc.LLVM_EXTRACT, [ + ...compiler.extractCommand({ + asm: true, + func: ['_ZN8portable20blit_row_s32a_opaqueEPjPKjij'], + output: '-', + input: '/home/lyc/swchromium-102.0.5005.115/out/c9094783eb43868cdbcf26b3266b0231d8fbd6e6/Release/SkOpts.ll', + }) +]); + +const llcProcess = spawn(tc.CC, [ + "-x", "ir", + "-", + ...compiler.generalCommand({ + outputKind: "assembly", + output: "-", + }), + ...compiler.optimizeOptions({ + optimize: "2" + }), + ...compiler.sw64TargetOptions({ + simd: true, + }) +]); + +const toObjectProcess = spawn(tc.CC, [ + "-x", "ir", + "-", + ...compiler.generalCommand({ + outputKind: "object", + output: "-", + }), + ...compiler.optimizeOptions({ + optimize: "2" + }), + ...compiler.sw64TargetOptions({ + simd: true, + }) +]); + +await fs.promises.mkdir(dir, { recursive: true }); + +[llcProcess, toObjectProcess].map(x => { extractProcess.stdout.pipe(x.stdin); }); +extractProcess.stdout.pipe(fs.createWriteStream(path.resolve(dir, 'extract.ll'))); + + +llcProcess.stdout.pipe(fs.createWriteStream(path.resolve(dir, 'extract.s'))); +toObjectProcess.stdout.pipe(fs.createWriteStream(path.resolve(dir, 'extract.o'))); + +const processes = [llcProcess, extractProcess, toObjectProcess]; + +processes.map(x => x.stderr.pipe(process.stderr)); + +await Promise.all(processes.map(promisifySpawn)); \ No newline at end of file diff --git a/src/chromium/skia-segfault/replaceObject.ts b/src/chromium/skia-segfault/replaceObject.ts new file mode 100644 index 0000000..4d4fcb2 --- /dev/null +++ b/src/chromium/skia-segfault/replaceObject.ts @@ -0,0 +1,23 @@ +/** + * 那个,你按照无锡的方法替换一下这个*.o变成scalar,重新生成一个chrome,看看还seg不? + * 就是这个o用scalar,和以前的其他o弄到一起 + */ + +import path from 'path'; +import { chromiumSource } from '../../chromium.js'; +import * as fs from 'fs'; + +const objects = [ + "obj/skia/skia_core_and_effects/SkBlitRow_D32.o", + "obj/skia/skia_core_and_effects/SkOpts.o", +]; + + +// Copy scalar objects to SIMD directory +const scalarBuild = path.resolve(chromiumSource, "out", "Release"); +const simdBuild = path.resolve(chromiumSource, "out", "c9094783eb43868cdbcf26b3266b0231d8fbd6e6", "Release"); + +await Promise.all(objects.map(async x => { + // Copy object from scalar directory to simd directory + await fs.promises.copyFile(path.resolve(scalarBuild, x), path.resolve(simdBuild, x)); +})) \ No newline at end of file