diff --git a/gcc/go/gofrontend/MERGE b/gcc/go/gofrontend/MERGE
index ead134c5fe307ce913deb7a05169e9c38002149a..323b07cb8c76bad6bac7cc33fd6c5ac4fc0ee34d 100644
--- a/gcc/go/gofrontend/MERGE
+++ b/gcc/go/gofrontend/MERGE
@@ -1,4 +1,4 @@
-1d3e0ceee45012a1c3b4ff7f5119a72f90bfcf6a
+9be198d960e4bc46e21e4da1e3d4a1619266b8ab
 
 The first line of this file holds the git revision number of the last
 merge done from the gofrontend repository.
diff --git a/libgo/go/runtime/traceback_gccgo.go b/libgo/go/runtime/traceback_gccgo.go
index b102826f4228fa3be8374fa27e060406159192b6..f61f9a0f2ddd895437a126421b06a6058d8a3590 100644
--- a/libgo/go/runtime/traceback_gccgo.go
+++ b/libgo/go/runtime/traceback_gccgo.go
@@ -89,6 +89,15 @@ func showframe(name string, gp *g) bool {
 	if g.m.throwing > 0 && gp != nil && (gp == g.m.curg || gp == g.m.caughtsig.ptr()) {
 		return true
 	}
+
+	// Gccgo can trace back through C functions called via cgo.
+	// We want to print those in the traceback.
+	// But unless GOTRACEBACK > 1 (checked below), still skip
+	// internal C functions and cgo-generated functions.
+	if !contains(name, ".") && !hasprefix(name, "__go_") && !hasprefix(name, "_cgo_") {
+		return true
+	}
+
 	level, _, _ := gotraceback()
 
 	// Special case: always show runtime.gopanic frame, so that we can