+2019-05-07 Cherry Zhang <cherryyz@google.com>
+
+ * lang.opt (-fgo-debug-optimization): New option.
+ * go-c.h (struct go_create_gogo_args): Add debug_optimization
+ field.
+ * go-lang.c (go_langhook_init): Set debug_optimization field.
+ * gccgo.texi (Invoking gccgo): Document -fgo-debug-optimization.
+
2019-03-06 Ian Lance Taylor <iant@golang.org>
PR go/89227
that match the given suffix @var{n}. This can be used to binary
search across functions to uncover escape analysis bugs.
+@item -fgo-debug-optimization
+@cindex @option{-fgo-debug-optimization}
+@cindex @option{-fno-go-debug-optimization}
+Output optimization diagnostics.
+
@item -fgo-c-header=@var{file}
@cindex @option{-fgo-c-header}
Write top-level named Go struct definitions to @var{file} as C code.
int debug_escape_level;
const char* debug_escape_hash;
int64_t nil_check_size_threshold;
+ bool debug_optimization;
};
extern void go_create_gogo (const struct go_create_gogo_args*);
args.debug_escape_level = go_debug_escape_level;
args.debug_escape_hash = go_debug_escape_hash;
args.nil_check_size_threshold = TARGET_AIX ? -1 : 4096;
+ args.debug_optimization = go_debug_optimization;
args.linemap = go_get_linemap();
args.backend = go_get_backend();
go_create_gogo (&args);
-4b3015de639cf22ed11ff96097555700909827c8
+dc9c1b43753f392fdc2045bcb7a4abaa44fe79f1
The first line of this file holds the git revision number of the last
merge done from the gofrontend repository.
if (args->debug_escape_hash != NULL)
::gogo->set_debug_escape_hash(args->debug_escape_hash);
::gogo->set_nil_check_size_threshold(args->nil_check_size_threshold);
+ if (args->debug_optimization)
+ ::gogo->set_debug_optimization(args->debug_optimization);
}
// Parse the input files.
check_divide_overflow_(true),
compiling_runtime_(false),
debug_escape_level_(0),
+ debug_optimization_(false),
nil_check_size_threshold_(4096),
verify_types_(),
interface_types_(),
set_debug_escape_hash(const std::string& s)
{ this->debug_escape_hash_ = s; }
+ // Return whether to output optimization diagnostics.
+ bool
+ debug_optimization() const
+ { return this->debug_optimization_; }
+
+ // Set the option to output optimization diagnostics.
+ void
+ set_debug_optimization(bool b)
+ { this->debug_optimization_ = b; }
+
// Return the size threshold used to determine whether to issue
// a nil-check for a given pointer dereference. A threshold of -1
// implies that all potentially faulting dereference ops should
// -fgo-debug-escape-hash option. The analysis is run only on
// functions with names that hash to the matching value.
std::string debug_escape_hash_;
+ // Whether to output optimization diagnostics, from the
+ // -fgo-debug-optimization option.
+ bool debug_optimization_;
// Nil-check size threshhold.
int64_t nil_check_size_threshold_;
// A list of types to verify.
range_temp, loc);
if (clear != NULL)
{
+ if (gogo->debug_optimization())
+ go_inform(loc, "map range clear");
temp_block->add_statement(clear);
return Statement::make_block_statement(temp_block, loc);
}
range_temp, loc);
if (clear != NULL)
{
+ if (gogo->debug_optimization())
+ go_inform(loc, "array range clear");
temp_block->add_statement(clear);
return Statement::make_block_statement(temp_block, loc);
}
Go Joined RejectNegative Var(go_debug_escape_hash) Init(0)
-fgo-debug-escape-hash=<string> Hash value to debug escape analysis.
+fgo-debug-optimization
+Go Var(go_debug_optimization) Init(0)
+Emit optimization diagnostics.
+
o
Go Joined Separate
; Documented in common.opt
+2019-05-07 Cherry Zhang <cherryyz@google.com>
+
+ * go.dg/arrayclear.go: New test.
+ * go.dg/mapclear.go: New test.
+
2019-05-07 Kelvin Nilsen <kelvin@gcc.gnu.org>
PR target/89765
--- /dev/null
+// { dg-do compile }
+// { dg-options "-fgo-debug-optimization" }
+
+package p
+
+var a [10]int
+
+func arrayClear() {
+ for i := range a { // { dg-error "array range clear" }
+ a[i] = 0
+ }
+}
+
+var s []int
+
+func sliceClear() {
+ for i := range s { // { dg-error "array range clear" }
+ s[i] = 0
+ }
+}
--- /dev/null
+// { dg-do compile }
+// { dg-options "-fgo-debug-optimization" }
+
+package p
+
+func clear(m map[int]int) {
+ for k := range m { // { dg-error "map range clear" }
+ delete(m, k)
+ }
+}