From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x133.google.com (mail-lf1-x133.google.com [IPv6:2a00:1450:4864:20::133]) by sourceware.org (Postfix) with ESMTPS id 8DA153858D37 for ; Thu, 27 Apr 2023 18:25:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 8DA153858D37 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lf1-x133.google.com with SMTP id 2adb3069b0e04-4efef769000so6203120e87.3 for ; Thu, 27 Apr 2023 11:25:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20221208; t=1682619900; x=1685211900; h=to:subject:message-id:date:from:mime-version:from:to:cc:subject :date:message-id:reply-to; bh=PO6OmB/hY8MUJEJj1KN0z0ywdvRhfH/R0WWQ/0O2590=; b=itd1c+FTQPdnIpvs6Dnpb7hD4BS8ldha92RrXoVP9HR2tkWTXMzdcOSKXZfA7WbI67 PA1d0LTjK7G5GsP24Jqf9OlxHHweaf/gvAbhTYIMYupTqzA46tOjTi6LARHBoqGtFPgv eyGydAmWFpradTc/fPAN9yftysA2/Z4/zSJW9fIcXlq33P7aYkIdITpQLPDUqgGbjL9/ b/MWcuRPhTLYT+AcbQRnZIf8Zfn85EEXvfBJkXH5fO+d54pWXsU+OtO1tb8/JVbr9FUt Dk8rBjL/9Kk+rEyzCIIt9vHAeW5h7vnHlAFv+0WeanHY0La1kd0MXqzMWoAvs59OTmda RbLw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1682619900; x=1685211900; h=to:subject:message-id:date:from:mime-version:x-gm-message-state :from:to:cc:subject:date:message-id:reply-to; bh=PO6OmB/hY8MUJEJj1KN0z0ywdvRhfH/R0WWQ/0O2590=; b=Hwu8MJLcDANqQOzC6HZSJhMePMrX665OdPcwHXQDZamrKcmjaVJZ6m3ex/IhvaUL81 lPSXMVwYobm3cleXSWFqdmVQmE89OUd7RRDvPwXBngIsrX5hbBSzDQyevReSaRaUiILO foagcgWDk11B7UuoXJwZzTlhhz/qOLt/Oraae+Oi5jN35J7G/74qpBfqXAX0jPuFhbjR PSB+RSII9Bneug7m2Tg0H4YS98/5pI6pZDQ6TRpxYKfVd/PZuHchFothDtGA/vXH/Uui fS+HygcG2zTOi9BrN4n1SkldiO2facGnt508r+5sSKqL8wR4tqNHHXfxJJu/L6hcj9jZ aFeQ== X-Gm-Message-State: AC+VfDwDjKnCMBPeQColK1RmejRJlBLo6phFKBwskECq03GOb66m4o2q XbTeaING7Zxn7OrMpjRcD1gjZgkYYDYvJ/p3AH/Ht1PMEeM= X-Google-Smtp-Source: ACHHUZ6BiYiP9MW4TCbYpqHjGK0ERxCUCO4YUdgs/KZxHDPM2iBtoIlfeEH+fc1FU9S7MSgYnfjchVSAzJDsBkEwgsU= X-Received: by 2002:ac2:424d:0:b0:4dd:a5ac:f0a2 with SMTP id m13-20020ac2424d000000b004dda5acf0a2mr1055443lfl.39.1682619900493; Thu, 27 Apr 2023 11:25:00 -0700 (PDT) MIME-Version: 1.0 From: Oleg Tolmatcev Date: Thu, 27 Apr 2023 20:24:48 +0200 Message-ID: Subject: [PATCH] make coff_compute_checksum faster To: binutils@sourceware.org Content-Type: text/plain; charset="UTF-8" X-Spam-Status: No, score=-9.3 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FREEMAIL_FROM,GIT_PATCH_0,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_PASS,TXREP,T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: This makes linking faster by reading 8 MB of data at once instead of reading 2 bytes at once. This drastically reduces the number of system calls. --- bfd/coffcode.h | 52 ++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-) diff --git a/bfd/coffcode.h b/bfd/coffcode.h index 19a5ce18..8118ff47 100644 --- a/bfd/coffcode.h +++ b/bfd/coffcode.h @@ -3361,30 +3361,66 @@ coff_read_word (bfd *abfd, unsigned int *value, unsigned int *pelength) return true; } +static bool +coff_read_word_from_buffer (unsigned char *b, int buf_size, + unsigned int *value, unsigned int *pelength) +{ + + if (buf_size < 1) + { + *value = 0; + return false; + } + + if (buf_size == 1) + *value = (unsigned int)b[0]; + else + *value = (unsigned int)(b[0] + (b[1] << 8)); + + *pelength += buf_size == 1 ? 1 : 2; + + return true; +} + static unsigned int coff_compute_checksum (bfd *abfd, unsigned int *pelength) { - bool more_data; file_ptr filepos; unsigned int value; unsigned int total; + unsigned char *buf; + unsigned char *cur_buf; + int buf_size; + int cur_buf_size; total = 0; *pelength = 0; - filepos = (file_ptr) 0; + filepos = (file_ptr)0; + buf = (unsigned char *)bfd_malloc (0x800000); + if (buf == NULL) + return 0; do { if (bfd_seek (abfd, filepos, SEEK_SET) != 0) - return 0; + return 0; - more_data = coff_read_word (abfd, &value, pelength); - total += value; - total = 0xffff & (total + (total >> 0x10)); - filepos += 2; + buf_size = bfd_bread (buf, 0x800000, abfd); + cur_buf_size = buf_size; + cur_buf = buf; + while (cur_buf_size > 0) + { + coff_read_word_from_buffer (cur_buf, cur_buf_size, &value, pelength); + cur_buf += 2; + cur_buf_size -= 2; + total += value; + total = 0xffff & (total + (total >> 0x10)); + } + filepos += buf_size; } - while (more_data); + while (buf_size > 0); + free (buf); return (0xffff & (total + (total >> 0x10))); } -- 2.40.0.windows.1