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:
Ian Lance Taylor 2015-07-14 01:22:25 +00:00
parent d8b6e6a172
commit 67a546ab45
4 changed files with 4 additions and 23 deletions

View File

@ -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.

View File

@ -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.

View File

@ -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())

View File

@ -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);
}