|  | 
| 1 |  | -//=== feature_bits.c - Update RISC-V Feature Bits Structure -*- C -*-=========// | 
|  | 1 | +//=== cpu_model/riscv.c - Update RISC-V Feature Bits Structure -*- C -*-======// | 
| 2 | 2 | // | 
| 3 | 3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | 
| 4 | 4 | // See https://llvm.org/LICENSE.txt for license information. | 
| 5 | 5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | 
| 6 | 6 | // | 
| 7 | 7 | //===----------------------------------------------------------------------===// | 
| 8 | 8 | 
 | 
|  | 9 | +#include "cpu_model.h" | 
|  | 10 | + | 
| 9 | 11 | #define RISCV_FEATURE_BITS_LENGTH 1 | 
| 10 | 12 | struct { | 
| 11 | 13 |   unsigned length; | 
| @@ -204,12 +206,10 @@ static void initRISCVFeature(struct riscv_hwprobe Hwprobes[]) { | 
| 204 | 206 |   // This unsets all extension bitmask bits. | 
| 205 | 207 | 
 | 
| 206 | 208 |   // Init vendor extension | 
| 207 |  | -  __riscv_vendor_feature_bits.length = 0; | 
| 208 | 209 |   __riscv_vendor_feature_bits.vendorID = Hwprobes[2].value; | 
| 209 | 210 | 
 | 
| 210 | 211 |   // Init standard extension | 
| 211 | 212 |   // TODO: Maybe Extension implied generate from tablegen? | 
| 212 |  | -  __riscv_feature_bits.length = RISCV_FEATURE_BITS_LENGTH; | 
| 213 | 213 | 
 | 
| 214 | 214 |   unsigned long long features[RISCV_FEATURE_BITS_LENGTH]; | 
| 215 | 215 |   int i; | 
| @@ -277,11 +277,21 @@ static void initRISCVFeature(struct riscv_hwprobe Hwprobes[]) { | 
| 277 | 277 | 
 | 
| 278 | 278 | static int FeaturesBitCached = 0; | 
| 279 | 279 | 
 | 
| 280 |  | -void __init_riscv_feature_bits() { | 
|  | 280 | +void __init_riscv_feature_bits() CONSTRUCTOR_ATTRIBUTE; | 
|  | 281 | + | 
|  | 282 | +// A constructor function that sets __riscv_feature_bits, and | 
|  | 283 | +// __riscv_vendor_feature_bits to the right values.  This needs to run | 
|  | 284 | +// only once.  This constructor is given the highest priority and it should | 
|  | 285 | +// run before constructors without the priority set.  However, it still runs | 
|  | 286 | +// after ifunc initializers and needs to be called explicitly there. | 
|  | 287 | +void CONSTRUCTOR_ATTRIBUTE __init_riscv_feature_bits() { | 
| 281 | 288 | 
 | 
| 282 | 289 |   if (FeaturesBitCached) | 
| 283 | 290 |     return; | 
| 284 | 291 | 
 | 
|  | 292 | +  __riscv_feature_bits.length = RISCV_FEATURE_BITS_LENGTH; | 
|  | 293 | +  __riscv_vendor_feature_bits.length = RISCV_VENDOR_FEATURE_BITS_LENGTH; | 
|  | 294 | + | 
| 285 | 295 | #if defined(__linux__) | 
| 286 | 296 |   struct riscv_hwprobe Hwprobes[] = { | 
| 287 | 297 |       {RISCV_HWPROBE_KEY_BASE_BEHAVIOR, 0}, | 
|  | 
0 commit comments