From b2290229c23fed8e4a63241568e436b1daa1196f Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Wed, 2 Nov 2016 19:41:01 -0400 Subject: [PATCH] cmd/cgo: add #line directives to avoid printing bogus references to Go source files A bit contrived to come up with an example, but it happened in #15836, somehow. $ cat /tmp/x.go package main /* #include int foo(void); int foo(void) { return 2; } #define int asdf */ import "C" func main() { println(C.foo()) } $ go run /tmp/x.go # command-line-arguments cgo-builtin-prolog:9:31: error: unknown type name 'asdf' <<<<< _GoString_ GoStringN(char *p, int l); ^ /tmp/x.go:12:13: note: expanded from macro 'int' #define int asdf ^ cgo-builtin-prolog:10:28: error: unknown type name 'asdf' <<<<< _GoBytes_ GoBytes(void *p, int n); ^ /tmp/x.go:12:13: note: expanded from macro 'int' #define int asdf ^ 2 errors generated. The two marked lines used to refer incorrectly to /tmp/x.go. Fixes #15836. Change-Id: I08ef60a53cfd148112fceb651eaf7b75d94a7a8d Reviewed-on: https://go-review.googlesource.com/32613 Run-TryBot: Russ Cox TryBot-Result: Gobot Gobot Reviewed-by: Ian Lance Taylor --- src/cmd/cgo/ast.go | 1 + src/cmd/cgo/gcc.go | 1 + src/cmd/cgo/out.go | 13 +++++++++++++ 3 files changed, 15 insertions(+) diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go index 000ecd4468..1d6354ad9d 100644 --- a/src/cmd/cgo/ast.go +++ b/src/cmd/cgo/ast.go @@ -87,6 +87,7 @@ func (f *File) ReadGo(name string) { if cg != nil { f.Preamble += fmt.Sprintf("#line %d %q\n", sourceLine(cg), name) f.Preamble += commentText(cg) + "\n" + f.Preamble += "#line 1 \"cgo-generated-wrapper\"\n" } } } diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index de87df0798..8fd490ce95 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -429,6 +429,7 @@ func (p *Package) loadDWARF(f *File, names []*Name) { var b bytes.Buffer b.WriteString(f.Preamble) b.WriteString(builtinProlog) + b.WriteString("#line 1 \"cgo-dwarf-inference\"\n") for i, n := range names { fmt.Fprintf(&b, "__typeof__(%s) *__cgo__%d;\n", n.C, i) if n.Kind == "const" { diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 95f90920bf..1940f9176c 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -126,6 +126,13 @@ func (p *Package) writeDefs() { fmt.Fprint(fgo2, goProlog) } + if fc != nil { + fmt.Fprintf(fc, "#line 1 \"cgo-generated-wrappers\"\n") + } + if fm != nil { + fmt.Fprintf(fm, "#line 1 \"cgo-generated-wrappers\"\n") + } + gccgoSymbolPrefix := p.gccgoSymbolPrefix() cVars := make(map[string]bool) @@ -1301,6 +1308,7 @@ func (p *Package) cgoType(e ast.Expr) *Type { } const gccProlog = ` +#line 1 "cgo-gcc-prolog" /* If x and y are not equal, the type will be invalid (have a negative array count) and an inscrutable error will come @@ -1334,6 +1342,7 @@ const noTsanProlog = ` // This must match the TSAN code in runtime/cgo/libcgo.h. const yesTsanProlog = ` +#line 1 "cgo-tsan-prolog" #define CGO_NO_SANITIZE_THREAD __attribute__ ((no_sanitize_thread)) long long _cgo_sync __attribute__ ((common)); @@ -1356,6 +1365,7 @@ static void _cgo_tsan_release() { var tsanProlog = noTsanProlog const builtinProlog = ` +#line 1 "cgo-builtin-prolog" #include /* for ptrdiff_t and size_t below */ /* Define intgo when compiling with GCC. */ @@ -1508,6 +1518,7 @@ func (p *Package) cPrologGccgo() string { } const cPrologGccgo = ` +#line 1 "cgo-c-prolog-gccgo" #include #include #include @@ -1605,6 +1616,7 @@ func (p *Package) gccExportHeaderProlog() string { const gccExportHeaderProlog = ` /* Start of boilerplate cgo prologue. */ +#line 1 "cgo-gcc-export-header-prolog" #ifndef GO_CGO_PROLOGUE_H #define GO_CGO_PROLOGUE_H @@ -1658,6 +1670,7 @@ const gccExportHeaderEpilog = ` // We use weak declarations, and test the addresses, so that this code // works with older versions of gccgo. const gccgoExportFileProlog = ` +#line 1 "cgo-gccgo-export-file-prolog" extern _Bool runtime_iscgo __attribute__ ((weak)); static void GoInit(void) __attribute__ ((constructor));