From 18de4e57ebc1c4e3466a61ba2dc0415535ddf7aa Mon Sep 17 00:00:00 2001 From: luoliwoshang <2643523683@qq.com> Date: Mon, 22 Jul 2024 23:08:56 +0800 Subject: [PATCH] env:fix incorrect extra line breaks & subcmd match --- cl/_testlibc/demangle/in.go | 15 ++++++++ cl/_testlibc/demangle/out.ll | 69 ++++++++++++++++++++++++++++++++++++ internal/build/build.go | 2 +- xtool/env/env.go | 6 ++-- 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 cl/_testlibc/demangle/in.go create mode 100644 cl/_testlibc/demangle/out.ll diff --git a/cl/_testlibc/demangle/in.go b/cl/_testlibc/demangle/in.go new file mode 100644 index 000000000..d1b0d5912 --- /dev/null +++ b/cl/_testlibc/demangle/in.go @@ -0,0 +1,15 @@ +package main + +import ( + "github.com/goplus/llgo/c" + "github.com/goplus/llgo/cpp/llvm" +) + +func main() { + mangledName := "__ZNK9INIReader10ParseErrorEv" + if name := llvm.ItaniumDemangle(mangledName, true); name != nil { + c.Printf(c.Str("%s\n"), name) + } else { + println("Failed to demangle") + } +} diff --git a/cl/_testlibc/demangle/out.ll b/cl/_testlibc/demangle/out.ll new file mode 100644 index 000000000..a3886f6a9 --- /dev/null +++ b/cl/_testlibc/demangle/out.ll @@ -0,0 +1,69 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } + +@"main.init$guard" = global i1 false, align 1 +@__llgo_argc = global i32 0, align 4 +@__llgo_argv = global ptr null, align 8 +@0 = private unnamed_addr constant [29 x i8] c"__ZNK9INIReader10ParseErrorEv", align 1 +@1 = private unnamed_addr constant [4 x i8] c"%s\0A\00", align 1 +@2 = private unnamed_addr constant [18 x i8] c"Failed to demangle", align 1 + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_llgo_0: + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @0, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 29, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + %6 = call ptr @_ZN4llvm15itaniumDemangleENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEb(%"github.com/goplus/llgo/internal/runtime.String" %5, i1 true) + %7 = icmp ne ptr %6, null + br i1 %7, label %_llgo_1, label %_llgo_3 + +_llgo_1: ; preds = %_llgo_0 + %8 = call i32 (ptr, ...) @printf(ptr @1, ptr %6) + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_3, %_llgo_1 + ret i32 0 + +_llgo_3: ; preds = %_llgo_0 + %9 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 0 + store ptr @2, ptr %10, align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1 + store i64 18, ptr %11, align 4 + %12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %12) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + br label %_llgo_2 +} + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare ptr @_ZN4llvm15itaniumDemangleENSt3__117basic_string_viewIcNS0_11char_traitsIcEEEEb(%"github.com/goplus/llgo/internal/runtime.String", i1) + +declare i32 @printf(ptr, ...) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) diff --git a/internal/build/build.go b/internal/build/build.go index 0d2165e5d..a45a02518 100644 --- a/internal/build/build.go +++ b/internal/build/build.go @@ -283,7 +283,7 @@ func buildAllPkgs(ctx *context, initial []*packages.Package, verbose bool) (pkgs for _, param := range altParts { param = strings.TrimSpace(param) if strings.ContainsRune(param, '$') { - expd = strings.TrimSpace(env.ExpandEnv(param)) + expd = env.ExpandEnv(param) ctx.nLibdir++ } else { expd = param diff --git a/xtool/env/env.go b/xtool/env/env.go index ded23cfff..062c043f4 100644 --- a/xtool/env/env.go +++ b/xtool/env/env.go @@ -35,7 +35,7 @@ func ExpandEnv(s string) string { func expandEnvWithCmd(s string) string { expanded := reSubcmd.ReplaceAllStringFunc(s, func(m string) string { - subcmd := strings.TrimSpace(s[2 : len(s)-1]) + subcmd := strings.TrimSpace(m[2 : len(m)-1]) args := parseSubcmd(subcmd) @@ -55,9 +55,9 @@ func expandEnvWithCmd(s string) string { return "" } - return string(out) + return strings.Replace(strings.TrimSpace(string(out)), "\n", " ", -1) }) - return os.Expand(expanded, os.Getenv) + return strings.TrimSpace(os.Expand(expanded, os.Getenv)) } func parseSubcmd(s string) []string {