OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [newlib-1.17.0/] [newlib/] [libc/] [sys/] [linux/] [include/] [dl-hash.h] - Blame information for rev 148

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 148 jeremybenn
/* Compute hash value for given string according to ELF standard.
2
   Copyright (C) 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
3
   This file is part of the GNU C Library.
4
 
5
   The GNU C Library is free software; you can redistribute it and/or
6
   modify it under the terms of the GNU Lesser General Public
7
   License as published by the Free Software Foundation; either
8
   version 2.1 of the License, or (at your option) any later version.
9
 
10
   The GNU C Library is distributed in the hope that it will be useful,
11
   but WITHOUT ANY WARRANTY; without even the implied warranty of
12
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13
   Lesser General Public License for more details.
14
 
15
   You should have received a copy of the GNU Lesser General Public
16
   License along with the GNU C Library; if not, write to the Free
17
   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18
   02111-1307 USA.  */
19
 
20
#ifndef _DL_HASH_H
21
#define _DL_HASH_H      1
22
 
23
 
24
/* This is the hashing function specified by the ELF ABI.  In the
25
   first five operations no overflow is possible so we optimized it a
26
   bit.  */
27
static inline unsigned int
28
_dl_elf_hash (const unsigned char *name)
29
{
30
  unsigned long int hash = 0;
31
  if (*name != '\0')
32
    {
33
      hash = *name++;
34
      if (*name != '\0')
35
        {
36
          hash = (hash << 4) + *name++;
37
          if (*name != '\0')
38
            {
39
              hash = (hash << 4) + *name++;
40
              if (*name != '\0')
41
                {
42
                  hash = (hash << 4) + *name++;
43
                  if (*name != '\0')
44
                    {
45
                      hash = (hash << 4) + *name++;
46
                      while (*name != '\0')
47
                        {
48
                          unsigned long int hi;
49
                          hash = (hash << 4) + *name++;
50
                          hi = hash & 0xf0000000;
51
 
52
                          /* The algorithm specified in the ELF ABI is as
53
                             follows:
54
 
55
                             if (hi != 0)
56
                               hash ^= hi >> 24;
57
 
58
                             hash &= ~hi;
59
 
60
                             But the following is equivalent and a lot
61
                             faster, especially on modern processors.  */
62
 
63
                          hash ^= hi;
64
                          hash ^= hi >> 24;
65
                        }
66
                    }
67
                }
68
            }
69
        }
70
    }
71
  return hash;
72
}
73
 
74
#endif /* dl-hash.h */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.