Skip to content

Commit ff09567

Browse files
committed
[𝘀𝗽𝗿] changes introduced through rebase
Created using spr 1.3.4 [skip ci]
2 parents aa344f0 + 82264d2 commit ff09567

File tree

140 files changed

+20727
-694
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

140 files changed

+20727
-694
lines changed

clang/include/clang/CIR/Passes.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
//===----------------------------------------------------------------------===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// This file exposes the entry points to create compiler passes for ClangIR.
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#ifndef CLANG_CIR_PASSES_H
14+
#define CLANG_CIR_PASSES_H
15+
16+
#include "mlir/Pass/Pass.h"
17+
18+
#include <memory>
19+
20+
namespace cir {
21+
namespace direct {
22+
/// Create a pass that fully lowers CIR to the LLVMIR dialect.
23+
std::unique_ptr<mlir::Pass> createConvertCIRToLLVMPass();
24+
25+
/// Adds passes that fully lower CIR to the LLVMIR dialect.
26+
void populateCIRToLLVMPasses(mlir::OpPassManager &pm);
27+
28+
} // namespace direct
29+
} // end namespace cir
30+
31+
#endif // CLANG_CIR_PASSES_H

clang/lib/Analysis/UnsafeBufferUsage.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -462,6 +462,25 @@ AST_MATCHER(ArraySubscriptExpr, isSafeArraySubscript) {
462462
// bug
463463
if (ArrIdx.isNonNegative() && ArrIdx.getLimitedValue() < limit)
464464
return true;
465+
} else if (const auto *BE = dyn_cast<BinaryOperator>(IndexExpr)) {
466+
// For an integer expression `e` and an integer constant `n`, `e & n` and
467+
// `n & e` are bounded by `n`:
468+
if (BE->getOpcode() != BO_And)
469+
return false;
470+
471+
const Expr *LHS = BE->getLHS();
472+
const Expr *RHS = BE->getRHS();
473+
474+
if ((!LHS->isValueDependent() &&
475+
LHS->EvaluateAsInt(EVResult,
476+
Finder->getASTContext())) || // case: `n & e`
477+
(!RHS->isValueDependent() &&
478+
RHS->EvaluateAsInt(EVResult, Finder->getASTContext()))) { // `e & n`
479+
llvm::APSInt result = EVResult.Val.getInt();
480+
if (result.isNonNegative() && result.getLimitedValue() < limit)
481+
return true;
482+
}
483+
return false;
465484
}
466485
return false;
467486
}

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include "clang/CIR/Dialect/IR/CIRAttrVisitor.h"
2828
#include "clang/CIR/Dialect/IR/CIRDialect.h"
2929
#include "clang/CIR/MissingFeatures.h"
30+
#include "clang/CIR/Passes.h"
3031
#include "llvm/IR/Module.h"
3132
#include "llvm/Support/TimeProfiler.h"
3233

@@ -304,11 +305,11 @@ void ConvertCIRToLLVMPass::runOnOperation() {
304305
signalPassFailure();
305306
}
306307

307-
static std::unique_ptr<mlir::Pass> createConvertCIRToLLVMPass() {
308+
std::unique_ptr<mlir::Pass> createConvertCIRToLLVMPass() {
308309
return std::make_unique<ConvertCIRToLLVMPass>();
309310
}
310311

311-
static void populateCIRToLLVMPasses(mlir::OpPassManager &pm) {
312+
void populateCIRToLLVMPasses(mlir::OpPassManager &pm) {
312313
pm.addPass(createConvertCIRToLLVMPass());
313314
}
314315

clang/lib/Serialization/ModuleManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ ModuleManager::addModule(StringRef FileName, ModuleKind Type,
119119
// Note: ExpectedSize and ExpectedModTime will be 0 for MK_ImplicitModule
120120
// when using an ASTFileSignature.
121121
if (lookupModuleFile(FileName, ExpectedSize, ExpectedModTime, Entry)) {
122-
ErrorStr = "module file out of date";
122+
ErrorStr = "module file has a different size or mtime than expected";
123123
return OutOfDate;
124124
}
125125

clang/test/CIR/IR/func.cir

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
// RUN: cir-opt %s | FileCheck %s
2+
3+
module {
4+
// void empty() { }
5+
cir.func @empty() -> !cir.void {
6+
cir.return
7+
}
8+
// CHECK: cir.func @empty() -> !cir.void {
9+
// CHECK: cir.return
10+
// CHECK: }
11+
12+
// void voidret() { return; }
13+
cir.func @voidret() -> !cir.void {
14+
cir.return
15+
}
16+
// CHECK: cir.func @voidret() -> !cir.void {
17+
// CHECK: cir.return
18+
// CHECK: }
19+
20+
// int intfunc() { return 42; }
21+
cir.func @intfunc() -> !cir.int<s, 32> {
22+
%0 = cir.const #cir.int<42> : !cir.int<s, 32>
23+
cir.return %0 : !cir.int<s, 32>
24+
}
25+
// CHECK: cir.func @intfunc() -> !cir.int<s, 32> {
26+
// CHECK: %[[VAL:.*]] = cir.const #cir.int<42> : !cir.int<s, 32>
27+
// CHECK: cir.return %[[VAL]] : !cir.int<s, 32>
28+
// CHECK: }
29+
30+
// int scopes() {
31+
// {
32+
// {
33+
// return 99;
34+
// }
35+
// }
36+
//}
37+
cir.func @scopes() -> !cir.int<s, 32> {
38+
cir.scope {
39+
cir.scope {
40+
%0 = cir.const #cir.int<99> : !cir.int<s, 32>
41+
cir.return %0 : !cir.int<s, 32>
42+
}
43+
}
44+
cir.trap
45+
}
46+
// CHECK: cir.func @scopes() -> !cir.int<s, 32> {
47+
// CHECK: cir.scope {
48+
// CHECK: cir.scope {
49+
// CHECK: %[[VAL:.*]] = cir.const #cir.int<99> : !cir.int<s, 32>
50+
// CHECK: cir.return %[[VAL]] : !cir.int<s, 32>
51+
// CHECK: }
52+
// CHECK: }
53+
// CHECK: cir.trap
54+
// CHECK: }
55+
56+
// long longfunc() { return 42l; }
57+
cir.func @longfunc() -> !cir.int<s, 64> {
58+
%0 = cir.const #cir.int<42> : !cir.int<s, 64>
59+
cir.return %0 : !cir.int<s, 64>
60+
}
61+
// CHECK: cir.func @longfunc() -> !cir.int<s, 64>
62+
// CHECK: %0 = cir.const #cir.int<42> : !cir.int<s, 64>
63+
// CHECK: cir.return %0 : !cir.int<s, 64>
64+
// CHECK: }
65+
66+
// unsigned unsignedfunc() { return 42u; }
67+
cir.func @unsignedfunc() -> !cir.int<u, 32> {
68+
%0 = cir.const #cir.int<42> : !cir.int<u, 32>
69+
cir.return %0 : !cir.int<u, 32>
70+
}
71+
// CHECK: cir.func @unsignedfunc() -> !cir.int<u, 32>
72+
// CHECK: %[[VAL:.*]] = cir.const #cir.int<42> : !cir.int<u, 32>
73+
// CHECK: cir.return %[[VAL]] : !cir.int<u, 32>
74+
// CHECK: }
75+
76+
// unsigned long long ullfunc() { return 42ull; }
77+
cir.func @ullfunc() -> !cir.int<u, 64> {
78+
%0 = cir.const #cir.int<42> : !cir.int<u, 64>
79+
cir.return %0 : !cir.int<u, 64>
80+
}
81+
// CHECK: cir.func @ullfunc() -> !cir.int<u, 64>
82+
// CHECK: %[[VAL:.*]] = cir.const #cir.int<42> : !cir.int<u, 64>
83+
// CHECK: cir.return %[[VAL:.*]] : !cir.int<u, 64>
84+
// CHECK: }
85+
}

clang/test/CIR/IR/global.cir

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
// RUN: cir-opt %s -o - | FileCheck %s
2+
3+
module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
4+
cir.global @c : !cir.int<s, 8>
5+
cir.global @sc : !cir.int<s, 8>
6+
cir.global @uc : !cir.int<u, 8>
7+
cir.global @ss : !cir.int<s, 16>
8+
cir.global @us = #cir.int<100> : !cir.int<u, 16>
9+
cir.global @si = #cir.int<42> : !cir.int<s, 32>
10+
cir.global @ui : !cir.int<u, 32>
11+
cir.global @sl : !cir.int<s, 64>
12+
cir.global @ul : !cir.int<u, 64>
13+
cir.global @sll : !cir.int<s, 64>
14+
cir.global @ull = #cir.int<123456> : !cir.int<u, 64>
15+
cir.global @s128 : !cir.int<s, 128>
16+
cir.global @u128 : !cir.int<u, 128>
17+
cir.global @wc : !cir.int<s, 32>
18+
cir.global @c8 : !cir.int<u, 8>
19+
cir.global @c16 : !cir.int<u, 16>
20+
cir.global @c32 : !cir.int<u, 32>
21+
cir.global @sb20 : !cir.int<s, 20>
22+
cir.global @ub48 : !cir.int<u, 48>
23+
cir.global @f16 : !cir.f16
24+
cir.global @bf16 : !cir.bf16
25+
cir.global @f : !cir.float
26+
cir.global @d = #cir.fp<1.250000e+00> : !cir.double
27+
cir.global @ld : !cir.long_double<!cir.f80>
28+
cir.global @f128 : !cir.f128
29+
cir.global @vp : !cir.ptr<!cir.void>
30+
cir.global @ip = #cir.ptr<null> : !cir.ptr<!cir.int<s, 32>>
31+
cir.global @dp : !cir.ptr<!cir.double>
32+
cir.global @cpp : !cir.ptr<!cir.ptr<!cir.int<s, 8>>>
33+
cir.global @fp : !cir.ptr<!cir.func<!cir.void ()>>
34+
cir.global @fpii = #cir.ptr<null> : !cir.ptr<!cir.func<!cir.int<s, 32> (!cir.int<s, 32>)>>
35+
cir.global @fpvar : !cir.ptr<!cir.func<!cir.void (!cir.int<s, 32>, ...)>>
36+
}
37+
38+
// CHECK: cir.global @c : !cir.int<s, 8>
39+
// CHECK: cir.global @sc : !cir.int<s, 8>
40+
// CHECK: cir.global @uc : !cir.int<u, 8>
41+
// CHECK: cir.global @ss : !cir.int<s, 16>
42+
// CHECK: cir.global @us = #cir.int<100>
43+
// CHECK: cir.global @si = #cir.int<42>
44+
// CHECK: cir.global @ui : !cir.int<u, 32>
45+
// CHECK: cir.global @sl : !cir.int<s, 64>
46+
// CHECK: cir.global @ul : !cir.int<u, 64>
47+
// CHECK: cir.global @sll : !cir.int<s, 64>
48+
// CHECK: cir.global @ull = #cir.int<123456> : !cir.int<u, 64>
49+
// CHECK: cir.global @s128 : !cir.int<s, 128>
50+
// CHECK: cir.global @u128 : !cir.int<u, 128>
51+
// CHECK: cir.global @wc : !cir.int<s, 32>
52+
// CHECK: cir.global @c8 : !cir.int<u, 8>
53+
// CHECK: cir.global @c16 : !cir.int<u, 16>
54+
// CHECK: cir.global @c32 : !cir.int<u, 32>
55+
// CHECK: cir.global @sb20 : !cir.int<s, 20>
56+
// CHECK: cir.global @ub48 : !cir.int<u, 48>
57+
// CHECK: cir.global @f16 : !cir.f16
58+
// CHECK: cir.global @bf16 : !cir.bf16
59+
// CHECK: cir.global @f : !cir.float
60+
// CHECK: cir.global @d = #cir.fp<1.250000e+00> : !cir.double
61+
// CHECK: cir.global @ld : !cir.long_double<!cir.f80>
62+
// CHECK: cir.global @f128 : !cir.f128
63+
// CHECK: cir.global @vp : !cir.ptr<!cir.void>
64+
// CHECK: cir.global @ip = #cir.ptr<null> : !cir.ptr<!cir.int<s, 32>>
65+
// CHECK: cir.global @dp : !cir.ptr<!cir.double>
66+
// CHECK: cir.global @cpp : !cir.ptr<!cir.ptr<!cir.int<s, 8>>>
67+
// CHECK: cir.global @fp : !cir.ptr<!cir.func<!cir.void ()>>
68+
// CHECK: cir.global @fpii = #cir.ptr<null> : !cir.ptr<!cir.func<!cir.int<s, 32> (!cir.int<s, 32>)>>
69+
// CHECK: cir.global @fpvar : !cir.ptr<!cir.func<!cir.void (!cir.int<s, 32>, ...)>>

clang/test/CMakeLists.txt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,13 @@ list(APPEND CLANG_TEST_DEPS
8585
diagtool
8686
hmaptool
8787
)
88-
88+
89+
if(CLANG_ENABLE_CIR)
90+
list(APPEND CLANG_TEST_DEPS
91+
cir-opt
92+
)
93+
endif()
94+
8995
if(CLANG_ENABLE_STATIC_ANALYZER)
9096
list(APPEND CLANG_TEST_DEPS
9197
clang-check

clang/test/CodeGen/memtag-globals-asm.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
// CHECK-A: .memtag global_int
5252
// CHECK-A: .globl global_int
5353
// CHECK-A: .p2align 4, 0x0
54+
// CHECK-A: .zero 16
5455
// CHECK-A: .size global_int, 16
5556
int global_int;
5657
// CHECK-B: .memtag _ZL9local_int
@@ -66,25 +67,29 @@ static char local_buffer[16];
6667
// CHECK-D: .p2align 4, 0x0
6768
// CHECK-D: _ZL22local_buffer_local_end:
6869
// CHECK-D: .xword _ZL12local_buffer+16
70+
// CHECK-D: .zero 8
6971
// CHECK-D: .size _ZL22local_buffer_local_end, 16
7072
static char* local_buffer_local_end = &local_buffer[16];
7173
// CHECK-E: .memtag local_buffer_global_end
7274
// CHECK-E: .globl local_buffer_global_end
7375
// CHECK-E .p2align 4, 0x0
7476
// CHECK-E: local_buffer_global_end:
7577
// CHECK-E: .xword _ZL12local_buffer+16
78+
// CHECK-E: .zero 8
7679
// CHECK-E: .size local_buffer_global_end, 16
7780
char* local_buffer_global_end = &local_buffer[16];
7881

7982
// CHECK-F: .memtag global_buffer
8083
// CHECK-F: .globl global_buffer
8184
// CHECK-F: .p2align 4, 0x0
85+
// CHECK-F: .zero 16
8286
// CHECK-F: .size global_buffer, 16
8387
char global_buffer[16];
8488
// CHECK-G: .memtag _ZL23global_buffer_local_end
8589
// CHECK-G: .p2align 4, 0x0
8690
// CHECK-G: _ZL23global_buffer_local_end:
8791
// CHECK-G: .xword global_buffer+16
92+
// CHECK-G: .zero 8
8893
// CHECK-G: .size _ZL23global_buffer_local_end, 16
8994
static char* global_buffer_local_end = &global_buffer[16];
9095
// CHECK-H: .memtag global_buffer_global_end
@@ -104,6 +109,7 @@ class MyClass {
104109
// CHECK-I: .memtag _ZN7MyClass12my_class_intE
105110
// CHECK-I: .globl _ZN7MyClass12my_class_intE
106111
// CHECK-I: .p2align 4, 0x0
112+
// CHECK-I: .zero 16
107113
// CHECK-I: .size _ZN7MyClass12my_class_intE, 16
108114
int MyClass::my_class_int;
109115
// CHECK-NOT: .memtag _ZN7MyClass18my_class_const_intE
@@ -112,23 +118,27 @@ const int MyClass::my_class_const_int = 1;
112118
// CHECK-J: .memtag global_my_class
113119
// CHECK-J: .globl global_my_class
114120
// CHECK-J: .p2align 4, 0x0
121+
// CHECK-J: .zero 8
115122
// CHECK-J: .size global_my_class, 16
116123
MyClass global_my_class;
117124
// CHECK-K: .memtag _ZL14local_my_class
118125
// CHECK-K: .p2align 4, 0x0
126+
// CHECK-K: .zero 8
119127
// CHECK-K: .size _ZL14local_my_class, 16
120128
static MyClass local_my_class;
121129

122130
// CHECK-NOT: .memtag _ZL18local_const_string
123131
static const char local_const_string[] = "this is a local string";
124132
// CHECK-L: .memtag _ZL12local_string
125133
// CHECK-L: .p2align 4, 0x0
134+
// CHECK-L: .zero 9
126135
// CHECK-L: .size _ZL12local_string, 32
127136
static char local_string[] = "this is a local string";
128137

129138
// CHECK-M: .memtag global_atomic_int
130139
// CHECK-M: .globl global_atomic_int
131140
// CHECK-M: .p2align 4, 0x0
141+
// CHECK-M: .zero 16
132142
// CHECK-M: .size global_atomic_int, 16
133143
_Atomic(int) global_atomic_int;
134144
// CHECK-N: .memtag _ZL16local_atomic_int
@@ -144,6 +154,7 @@ union MyUnion {
144154
// CHECK-O: .memtag global_union
145155
// CHECK-O: .globl global_union
146156
// CHECK-O: .p2align 4, 0x0
157+
// CHECK-O: .zero 16
147158
// CHECK-O: .size global_union, 16
148159
MyUnion global_union;
149160
// CHECK-P: .memtag _ZL11local_union

clang/test/Modules/explicit-build.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -199,6 +199,6 @@
199199
// RUN: -fmodule-file=%t/c.pcm \
200200
// RUN: %s -DHAVE_A -DHAVE_B -DHAVE_C 2>&1 | FileCheck --check-prefix=CHECK-MISMATCHED-B %s
201201
//
202-
// CHECK-MISMATCHED-B: fatal error: module file '{{.*}}b.pcm' is out of date and needs to be rebuilt: module file out of date
202+
// CHECK-MISMATCHED-B: fatal error: module file '{{.*}}b.pcm' is out of date and needs to be rebuilt: module file has a different size or mtime than expected
203203
// CHECK-MISMATCHED-B-NEXT: note: imported by module 'c'
204204
// CHECK-MISMATCHED-B-NOT: note:

clang/test/SemaCXX/warn-unsafe-buffer-usage-array.cpp

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ void foo2(unsigned idx) {
1818

1919
struct Foo {
2020
int member_buffer[10];
21+
int x;
2122
};
23+
2224
void foo2(Foo& f, unsigned idx) {
2325
f.member_buffer[idx] = 0; // expected-warning{{unsafe buffer access}}
2426
}
@@ -33,6 +35,37 @@ void constant_idx_safe0(unsigned idx) {
3335
buffer[0] = 0;
3436
}
3537

38+
int array[10]; // expected-warning {{'array' is an unsafe buffer that does not perform bounds checks}}
39+
40+
void masked_idx1(unsigned long long idx, Foo f) {
41+
// Bitwise and operation
42+
array[idx & 5] = 10; // no-warning
43+
array[5 &idx] = 12; // no-warning
44+
array[idx & 11 & 5] = 3; // no warning
45+
array[idx & 11] = 20; // expected-note{{used in buffer access here}}
46+
array[idx &=5]; // expected-note{{used in buffer access here}}
47+
array[f.x & 5]; // no-warning
48+
array[5 & f.x]; // no-warning
49+
array[f.x & (-5)]; // expected-note{{used in buffer access here}}
50+
}
51+
52+
typedef unsigned long long uint64_t;
53+
typedef unsigned int uint32_t;
54+
typedef unsigned char uint8_t;
55+
56+
void type_conversions(uint64_t idx1, uint32_t idx2, uint8_t idx3) {
57+
array[(uint32_t)idx1 & 3];
58+
array[idx2 & 3];
59+
array[idx3 & 3];
60+
}
61+
62+
int array2[5]; // expected-warning {{'array2' is an unsafe buffer that does not perform bounds checks}}
63+
64+
void masked_idx_safe(unsigned long long idx) {
65+
array2[6 & 5]; // no warning
66+
array2[6 & idx & (idx + 1) & 5]; // expected-note{{used in buffer access here}}
67+
}
68+
3669
void constant_idx_unsafe(unsigned idx) {
3770
int buffer[10]; // expected-warning{{'buffer' is an unsafe buffer that does not perform bounds checks}}
3871
// expected-note@-1{{change type of 'buffer' to 'std::array' to label it for hardening}}

0 commit comments

Comments
 (0)