aboutsummaryrefslogtreecommitdiff
path: root/gcc/function.c
diff options
context:
space:
mode:
authorTamar Christina <tamar.christina@arm.com>2020-07-17 13:10:28 +0100
committerTamar Christina <tamar.christina@arm.com>2020-07-17 13:10:28 +0100
commitb399f3c6425f6c33b64e813899cbd589288ef716 (patch)
treee080c1808c5f228c5edd367d2cd339ce4948915c /gcc/function.c
parent42b47dae498aa7b849b9c9a165b22146de1934a1 (diff)
downloadgcc-b399f3c6425f6c33b64e813899cbd589288ef716.zip
gcc-b399f3c6425f6c33b64e813899cbd589288ef716.tar.gz
gcc-b399f3c6425f6c33b64e813899cbd589288ef716.tar.bz2
AArch64: Fix bugs in -mcpu=native detection.
This patch fixes a couple of issues in AArch64's -mcpu=native processing: The buffer used to read the lines from /proc/cpuinfo is 128 bytes long. While this was enough in the past with the increase in architecture extensions it is no longer enough. It results in two bugs: 1) No option string longer than 127 characters is correctly parsed. Features that are supported are silently ignored. 2) It incorrectly enables features that are not present on the machine: a) It checks for substring matching instead of full word matching. This makes it incorrectly detect sb support when ssbs is provided instead. b) Due to the truncation at the 127 char border it also incorrectly enables features due to the full feature being cut off and the part that is left accidentally enables something else. This breaks -mcpu=native detection on some of our newer system. The patch fixes these issues by reading full lines up to the \n in a string. This gives us the full feature line. Secondly it creates a set from this string to: 1) Reduce matching complexity from O(n*m) to O(n*logm). 2) Perform whole word matching instead of substring matching. To make this code somewhat cleaner I also changed from using char* to using std::string and std::set. Note that I have intentionally avoided the use of ifstream and stringstream to make it easier to backport. I have also not change the substring matching for the initial line classification as I cannot find a documented cpuinfo format which leads me to believe there may be kernels out there that require this which may be why the original code does this. I also do not want this to break if the kernel adds a new line that is long and indents the file by two tabs to keep everything aligned. In short I think an imprecise match is the right thing here. Test for this is added as the last thing in this series as it requires some changes to be made to be able to test this. gcc/ChangeLog: * config/aarch64/driver-aarch64.c (INCLUDE_SET): New. (parse_field): Use std::string. (split_words, readline, find_field): New. (host_detect_local_cpu): Fix truncation issues.
Diffstat (limited to 'gcc/function.c')
0 files changed, 0 insertions, 0 deletions