From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 31596 invoked by alias); 11 Oct 2013 21:45:58 -0000 Mailing-List: contact binutils-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: binutils-owner@sourceware.org Received: (qmail 31562 invoked by uid 89); 11 Oct 2013 21:45:58 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.1 required=5.0 tests=AWL,BAYES_00,RCVD_IN_DNSWL_LOW,RP_MATCHES_RCVD,SPF_PASS,URIBL_BLACK autolearn=no version=3.3.2 X-HELO: mail-ie0-f171.google.com Received: from mail-ie0-f171.google.com (HELO mail-ie0-f171.google.com) (209.85.223.171) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES128-SHA encrypted) ESMTPS; Fri, 11 Oct 2013 21:45:57 +0000 Received: by mail-ie0-f171.google.com with SMTP id at1so9322409iec.2 for ; Fri, 11 Oct 2013 14:45:55 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc:content-type; bh=841SZ1YIfBxaRGbyDvc410jj8fI0l8+QsHuqufKDaoU=; b=BnypOJd15KgCa/QfpgZeJXUHfdsiN+zNJHZrsh3+ltZxkQlyyaOLb+sEvfDWVpYx0H DOQ78utdXmlQxrBK7CZZYYusn7w5oqYNx8ds/IHWST1KS3r/sZs7XeABjuAHkEEObNi+ eizE6Vc/ZWSrwUfjaftpedhc/DgSsGJxPGsLgISMiPHMrEET0nxUmR6jlW94MXsqgvYT BDbEGwDfG9HuXejPE3gxclCTKv/T6BbpkTEW9ZwM0syTRciZVT3FZWeAFaoyGohVVIPy kYyqyFVhwdmDji6fNSoj1QPA3q7JrjcicARoP9JI+Avp6US80phKxO5o/77F7917Eo31 5M+g== X-Gm-Message-State: ALoCoQlwkKtzVRtIRta8xQOQ+pfMHpcE9ZGuqv1J1KNDfBIH8UVKWS2o8PpnlnCSreqARqRzNvRAwGxyCUFnFO4zljc/sTzLgX4jVEpkw2MBxbM+5iOlXxF/z6daIwD7AOPlsNA1+1Oa+jiMDPC7DPJRvOT8oHUOD76HW+6oHnF6XuECx1gWML4vYMLO3gIf+4JasagRnH6+79T5dXCcEHfczTdb/o3yrA== X-Received: by 10.43.154.73 with SMTP id ld9mr2234434icc.53.1381527955540; Fri, 11 Oct 2013 14:45:55 -0700 (PDT) MIME-Version: 1.0 Received: by 10.64.11.68 with HTTP; Fri, 11 Oct 2013 14:45:35 -0700 (PDT) In-Reply-To: References: From: Roland McGrath Date: Fri, 11 Oct 2013 21:45:00 -0000 Message-ID: Subject: Re: [PATCH] gold: remove false const from Target::do_adjust_elf_header To: Cary Coutant Cc: "binutils@sourceware.org" Content-Type: text/plain; charset=ISO-8859-1 X-SW-Source: 2013-10/txt/msg00185.txt.bz2 On Fri, Oct 11, 2013 at 2:26 PM, Cary Coutant wrote: > The call to parameters->target().adjust_elf_header() in output.cc is > so clearly wrong that I don't understand how this compiles with GCC > (for ARM, that is). Just by leaving the "const" off of the override in > Target_arm, we can completely subvert the const-ness of the reference > returned by parameters->target()? Separate compilation. In output.cc the compiler only sees the abstract class definition, where the method is const. In arm.cc the override is non-const, but that (evidently) doesn't make it a different overload (in the sense of having a separate vtable slot). GCC (at least 4.6.3, I haven't tried newer ones) does not warn about an override of a virtual function having mismatching constness, which is all that can be seen when compiling arm.cc. > I think a better approach would be to remove the "const" from the > Target* passed to the Output_file_header ctor and stored in a private > data member, then modify the call to adjust_elf_header() to be > "this->target_->adjust_elf_header()". There's no reason to call > parameters->target() here when we already have a pointer to the target > readily available. Like this? Thanks, Roland gold/ * target.h (Target::adjust_elf_header, Target::do_adjust_elf_header): Remove const from declaration. * target.cc (Sized_target::do_adjust_elf_header): Update definition. * sparc.cc (Target_sparc::do_adjust_elf_header): Likewise. * output.h (Output_file_header): Remove const from member target_ and corresponding constructor argument. * output.cc (Output_file_header::Output_file_header): Update prototype. (Output_file_header::do_sized_write): Use this->target_ in place of parameters()->target(). --- a/gold/output.cc +++ b/gold/output.cc @@ -435,7 +435,7 @@ Output_segment_headers::do_size() const // Output_file_header methods. -Output_file_header::Output_file_header(const Target* target, +Output_file_header::Output_file_header(Target* target, const Symbol_table* symtab, const Output_segment_headers* osh) : target_(target), @@ -577,7 +577,7 @@ Output_file_header::do_sized_write(Output_file* of) // Let the target adjust the ELF header, e.g., to set EI_OSABI in // the e_ident field. - parameters->target().adjust_elf_header(view, ehdr_size); + this->target_->adjust_elf_header(view, ehdr_size); of->write_output_view(0, ehdr_size, view); } --- a/gold/output.h +++ b/gold/output.h @@ -573,7 +573,7 @@ class Output_segment_headers : public Output_data class Output_file_header : public Output_data { public: - Output_file_header(const Target*, + Output_file_header(Target*, const Symbol_table*, const Output_segment_headers*); @@ -617,7 +617,7 @@ class Output_file_header : public Output_data off_t do_size() const; - const Target* target_; + Target* target_; const Symbol_table* symtab_; const Output_segment_headers* segment_header_; const Output_section_headers* section_header_; --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -217,7 +217,7 @@ class Target_sparc : public Sized_target const elfcpp::Ehdr& ehdr); void - do_adjust_elf_header(unsigned char* view, int len) const; + do_adjust_elf_header(unsigned char* view, int len); private: @@ -4339,7 +4339,7 @@ template void Target_sparc::do_adjust_elf_header( unsigned char* view, - int len) const + int len) { elfcpp::Ehdr_write oehdr(view); --- a/gold/target.cc +++ b/gold/target.cc @@ -1,6 +1,6 @@ // target.cc -- target support for gold. -// Copyright 2009, 2010, 2011 Free Software Foundation, Inc. +// Copyright 2009, 2010, 2011, 2013 Free Software Foundation, Inc. // Written by Doug Kwan . // This file is part of gold. @@ -219,7 +219,7 @@ Target::do_plt_fde_location(const Output_data* plt, unsigned char*, template void Sized_target::do_adjust_elf_header(unsigned char* view, - int len) const + int len) { elfcpp::ELFOSABI osabi = this->osabi(); if (osabi != elfcpp::ELFOSABI_NONE) --- a/gold/target.h +++ b/gold/target.h @@ -1,6 +1,6 @@ // target.h -- target support for gold -*- C++ -*- -// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012 +// Copyright 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013 // Free Software Foundation, Inc. // Written by Ian Lance Taylor . @@ -238,7 +238,7 @@ class Target // Adjust the output file header before it is written out. VIEW // points to the header in external form. LEN is the length. void - adjust_elf_header(unsigned char* view, int len) const + adjust_elf_header(unsigned char* view, int len) { return this->do_adjust_elf_header(view, len); } // Return address and size to plug into eh_frame FDEs associated with a PLT. @@ -548,7 +548,7 @@ class Target // By default, we set the EI_OSABI field if requested (in // Sized_target). virtual void - do_adjust_elf_header(unsigned char*, int) const = 0; + do_adjust_elf_header(unsigned char*, int) = 0; // Return address and size to plug into eh_frame FDEs associated with a PLT. virtual void @@ -1018,7 +1018,7 @@ class Sized_target : public Target // Set the EI_OSABI field if requested. virtual void - do_adjust_elf_header(unsigned char*, int) const; + do_adjust_elf_header(unsigned char*, int); // Handle target specific gc actions when adding a gc reference. virtual void