int
expression(Expression**);
+ static bool
+ skip_descriptor(Gogo* gogo, const Named_object*);
+
private:
Gogo* gogo_;
};
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()
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.
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();
// compile-time error.
//
// Implemented as a compile intrinsic.
-func FuncPCABI0(f any) uintptr {
- // The compiler should remove all calls.
- panic("FuncPCABI0")
-}
+func FuncPCABI0(f any) uintptr
// FuncPCABIInternal returns the entry PC of the function f. If f is a
// direct reference of a function, it must be defined as ABIInternal.
// the behavior is undefined.
//
// Implemented as a compile intrinsic.
-func FuncPCABIInternal(f any) uintptr {
- // The compiler should remove all calls.
- panic("FuncPCABIInternal")
-}
+func FuncPCABIInternal(f any) uintptr