aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2023-06-23 16:16:06 -0700
committerIan Lance Taylor <iant@golang.org>2023-06-23 16:16:06 -0700
commitf4d011b4aa0fc7a9e3df0dada2fd3e1e95e32a6c (patch)
tree9f9266c69e41e81f20bb6c4c3532001716793c22 /gcc
parent72ceed08d45137b0f1a9b4ea8ca533aa6489bc39 (diff)
downloadgcc-f4d011b4aa0fc7a9e3df0dada2fd3e1e95e32a6c.zip
gcc-f4d011b4aa0fc7a9e3df0dada2fd3e1e95e32a6c.tar.gz
gcc-f4d011b4aa0fc7a9e3df0dada2fd3e1e95e32a6c.tar.bz2
compiler, libgo: support bootstrapping gc compiler
In the Go 1.21 release the package internal/profile imports internal/lazyregexp. That works when bootstrapping with Go 1.17, because that compiler has internal/lazyregep and permits importing it. We also have internal/lazyregexp in libgo, but since it is not installed it is not available for importing. This CL adds internal/lazyregexp to the list of internal packages that are installed for bootstrapping. The Go 1.21, and earlier, releases have a couple of functions in the internal/abi package that are always fully intrinsified. The gofrontend recognizes and intrinsifies those functions as well. However, the gofrontend was also building function descriptors for references to the functions without calling them, which failed because there was nothing to refer to. That is OK for the gc compiler, which guarantees that the functions are only called, not referenced. This CL arranges to not generate function descriptors for these functions. For golang/go#60913 Reviewed-on: https://go-review.googlesource.com/c/gofrontend/+/504798
Diffstat (limited to 'gcc')
-rw-r--r--gcc/go/gofrontend/expressions.cc3
-rw-r--r--gcc/go/gofrontend/gogo.cc31
2 files changed, 32 insertions, 2 deletions
diff --git a/gcc/go/gofrontend/expressions.cc b/gcc/go/gofrontend/expressions.cc
index 1b3b3bf..88b4cea 100644
--- a/gcc/go/gofrontend/expressions.cc
+++ b/gcc/go/gofrontend/expressions.cc
@@ -12325,7 +12325,8 @@ Call_expression::intrinsify(Gogo* gogo,
return Runtime::make_call(code, loc, 3, a1, a2, a3);
}
}
- else if (package == "internal/abi")
+ else if (package == "internal/abi"
+ || package == "bootstrap/internal/abi") // for bootstrapping gc
{
if (is_method)
return NULL;
diff --git a/gcc/go/gofrontend/gogo.cc b/gcc/go/gofrontend/gogo.cc
index d35c6ba..cca03dc 100644
--- a/gcc/go/gofrontend/gogo.cc
+++ b/gcc/go/gofrontend/gogo.cc
@@ -3331,6 +3331,9 @@ class Create_function_descriptors : public Traverse
int
expression(Expression**);
+ static bool
+ skip_descriptor(Gogo* gogo, const Named_object*);
+
private:
Gogo* gogo_;
};
@@ -3341,6 +3344,9 @@ class Create_function_descriptors : public Traverse
int
Create_function_descriptors::function(Named_object* no)
{
+ if (Create_function_descriptors::skip_descriptor(this->gogo_, no))
+ return TRAVERSE_CONTINUE;
+
if (no->is_function()
&& no->func_value()->enclosing() == NULL
&& !no->func_value()->is_method()
@@ -3428,6 +3434,28 @@ Create_function_descriptors::expression(Expression** pexpr)
return TRAVERSE_CONTINUE;
}
+// The gc compiler has some special cases that it always compiles as
+// intrinsics. For those we don't want to generate a function
+// descriptor, as there will be no code for it to refer to.
+
+bool
+Create_function_descriptors::skip_descriptor(Gogo* gogo,
+ const Named_object* no)
+{
+ const std::string& pkgpath(no->package() == NULL
+ ? gogo->pkgpath()
+ : no->package()->pkgpath());
+
+ // internal/abi is the standard library package,
+ // bootstrap/internal/abi is the name used when bootstrapping the gc
+ // compiler.
+
+ return ((pkgpath == "internal/abi"
+ || pkgpath == "bootstrap/internal/abi")
+ && (no->name() == "FuncPCABI0"
+ || no->name() == "FuncPCABIInternal"));
+}
+
// Create function descriptors as needed. We need a function
// descriptor for all exported functions and for all functions that
// are referenced without being called.
@@ -3449,7 +3477,8 @@ Gogo::create_function_descriptors()
if (no->is_function_declaration()
&& !no->func_declaration_value()->type()->is_method()
&& !Linemap::is_predeclared_location(no->location())
- && !Gogo::is_hidden_name(no->name()))
+ && !Gogo::is_hidden_name(no->name())
+ && !Create_function_descriptors::skip_descriptor(this, no))
fndecls.push_back(no);
}
for (std::vector<Named_object*>::const_iterator p = fndecls.begin();