mirror of
https://github.com/gcc-mirror/gcc.git
synced 2026-05-06 14:59:39 +02:00
compiler,runtime: Determine if allocations need new pointers in runtime.
As the removed comment states, if the package being compiled played
certain tricks with pointers that looked like integers, the compiler
might allocate space for new pointers unnecessarily. Since the type
information on the heap is now precise, this logic can be moved to the
runtime.
Reviewed-on: https://go-review.googlesource.com/11581
From-SVN: r225757
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
83191e8e2cb9f47f7c1e6bcb9997f21163292612
|
||||
2c985e4781691fea3eb4171de85265bfbc4e4997
|
||||
|
||||
The first line of this file holds the git revision number of the last
|
||||
merge done from the gofrontend repository.
|
||||
|
||||
@@ -4391,15 +4391,7 @@ Gogo::allocate_memory(Type* type, Location location)
|
||||
Expression* td = Expression::make_type_descriptor(type, location);
|
||||
Expression* size =
|
||||
Expression::make_type_info(type, Expression::TYPE_INFO_SIZE);
|
||||
|
||||
// If this package imports unsafe, then it may play games with
|
||||
// pointers that look like integers. We should be able to determine
|
||||
// whether or not to use new pointers in libgo/go-new.c. FIXME.
|
||||
bool use_new_pointers = this->imported_unsafe_ || type->has_pointer();
|
||||
return Runtime::make_call((use_new_pointers
|
||||
? Runtime::NEW
|
||||
: Runtime::NEW_NOPOINTERS),
|
||||
location, 2, td, size);
|
||||
return Runtime::make_call(Runtime::NEW, location, 2, td, size);
|
||||
}
|
||||
|
||||
// Traversal class used to check for return statements.
|
||||
|
||||
@@ -223,10 +223,6 @@ DEF_GO_RUNTIME(REGISTER_GC_ROOTS, "__go_register_gc_roots", P1(POINTER), R0())
|
||||
// Allocate memory.
|
||||
DEF_GO_RUNTIME(NEW, "__go_new", P2(TYPE, UINTPTR), R1(POINTER))
|
||||
|
||||
// Allocate memory which can not contain pointers.
|
||||
DEF_GO_RUNTIME(NEW_NOPOINTERS, "__go_new_nopointers", P2(TYPE, UINTPTR), R1(POINTER))
|
||||
|
||||
|
||||
// Start a new goroutine.
|
||||
DEF_GO_RUNTIME(GO, "__go_go", P2(FUNC_PTR, POINTER), R0())
|
||||
|
||||
|
||||
@@ -8,19 +8,12 @@
|
||||
#include "runtime.h"
|
||||
#include "arch.h"
|
||||
#include "malloc.h"
|
||||
#include "go-type.h"
|
||||
|
||||
void *
|
||||
__go_new (const struct __go_type_descriptor *td, uintptr_t size)
|
||||
{
|
||||
return runtime_mallocgc (size,
|
||||
(uintptr) td | TypeInfo_SingleObject,
|
||||
0);
|
||||
}
|
||||
|
||||
void *
|
||||
__go_new_nopointers (const struct __go_type_descriptor *td, uintptr_t size)
|
||||
{
|
||||
return runtime_mallocgc (size,
|
||||
(uintptr) td | TypeInfo_SingleObject,
|
||||
FlagNoScan);
|
||||
td->__code & GO_NO_POINTERS ? FlagNoScan : 0);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user