| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,207 @@ | ||
| // NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --version 4 | ||
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s | ||
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -fsanitize-trap=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=TRAP | ||
| // RUN: %clang_cc1 -triple x86_64-pc-linux-gnu -emit-llvm -o - %s -fsanitize=signed-integer-overflow,integer-divide-by-zero,null -fsanitize-recover=signed-integer-overflow,integer-divide-by-zero,null | FileCheck %s --check-prefixes=RECOVER | ||
|
|
||
|
|
||
| // CHECK-LABEL: define dso_local i32 @div( | ||
| // CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 | ||
| // CHECK-NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4 | ||
| // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 | ||
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4 | ||
| // CHECK-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]] | ||
| // CHECK-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]] | ||
| // CHECK-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]] | ||
| // CHECK: handler.divrem_overflow: | ||
| // CHECK-NEXT: [[TMP6:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP7:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]] | ||
| // CHECK-NEXT: call void @__ubsan_handle_divrem_overflow_abort(ptr @[[GLOB1:[0-9]+]], i64 [[TMP6]], i64 [[TMP7]]) #[[ATTR3:[0-9]+]], !nosanitize [[META2]] | ||
| // CHECK-NEXT: unreachable, !nosanitize [[META2]] | ||
| // CHECK: cont: | ||
| // CHECK-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]] | ||
| // CHECK-NEXT: ret i32 [[DIV]] | ||
| // | ||
| // TRAP-LABEL: define dso_local i32 @div( | ||
| // TRAP-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] { | ||
| // TRAP-NEXT: entry: | ||
| // TRAP-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 | ||
| // TRAP-NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4 | ||
| // TRAP-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 | ||
| // TRAP-NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4 | ||
| // TRAP-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 | ||
| // TRAP-NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4 | ||
| // TRAP-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]] | ||
| // TRAP-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]] | ||
| // TRAP-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]] | ||
| // TRAP-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]] | ||
| // TRAP-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]] | ||
| // TRAP-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]] | ||
| // TRAP: trap: | ||
| // TRAP-NEXT: call void @llvm.ubsantrap(i8 3) #[[ATTR3:[0-9]+]], !nosanitize [[META2]] | ||
| // TRAP-NEXT: unreachable, !nosanitize [[META2]] | ||
| // TRAP: cont: | ||
| // TRAP-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]] | ||
| // TRAP-NEXT: ret i32 [[DIV]] | ||
| // | ||
| // RECOVER-LABEL: define dso_local i32 @div( | ||
| // RECOVER-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0:[0-9]+]] { | ||
| // RECOVER-NEXT: entry: | ||
| // RECOVER-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 | ||
| // RECOVER-NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4 | ||
| // RECOVER-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 | ||
| // RECOVER-NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4 | ||
| // RECOVER-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 | ||
| // RECOVER-NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4 | ||
| // RECOVER-NEXT: [[TMP2:%.*]] = icmp ne i32 [[TMP1]], 0, !nosanitize [[META2:![0-9]+]] | ||
| // RECOVER-NEXT: [[TMP3:%.*]] = icmp ne i32 [[TMP0]], -2147483648, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP4:%.*]] = icmp ne i32 [[TMP1]], -1, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[OR:%.*]] = or i1 [[TMP3]], [[TMP4]], !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP5:%.*]] = and i1 [[TMP2]], [[OR]], !nosanitize [[META2]] | ||
| // RECOVER-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_DIVREM_OVERFLOW:%.*]], !prof [[PROF3:![0-9]+]], !nosanitize [[META2]] | ||
| // RECOVER: handler.divrem_overflow: | ||
| // RECOVER-NEXT: [[TMP6:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP7:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: call void @__ubsan_handle_divrem_overflow(ptr @[[GLOB1:[0-9]+]], i64 [[TMP6]], i64 [[TMP7]]) #[[ATTR3:[0-9]+]], !nosanitize [[META2]] | ||
| // RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]] | ||
| // RECOVER: cont: | ||
| // RECOVER-NEXT: [[DIV:%.*]] = sdiv i32 [[TMP0]], [[TMP1]] | ||
| // RECOVER-NEXT: ret i32 [[DIV]] | ||
| // | ||
| int div(int x, int y) { | ||
| return x / y; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local i32 @null( | ||
| // CHECK-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8 | ||
| // CHECK-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8 | ||
| // CHECK-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8 | ||
| // CHECK-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]] | ||
| // CHECK-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]] | ||
| // CHECK: handler.type_mismatch: | ||
| // CHECK-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]] | ||
| // CHECK-NEXT: call void @__ubsan_handle_type_mismatch_v1_abort(ptr @[[GLOB2:[0-9]+]], i64 [[TMP2]]) #[[ATTR3]], !nosanitize [[META2]] | ||
| // CHECK-NEXT: unreachable, !nosanitize [[META2]] | ||
| // CHECK: cont: | ||
| // CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4 | ||
| // CHECK-NEXT: ret i32 [[TMP3]] | ||
| // | ||
| // TRAP-LABEL: define dso_local i32 @null( | ||
| // TRAP-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] { | ||
| // TRAP-NEXT: entry: | ||
| // TRAP-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8 | ||
| // TRAP-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8 | ||
| // TRAP-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8 | ||
| // TRAP-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]] | ||
| // TRAP-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]] | ||
| // TRAP: trap: | ||
| // TRAP-NEXT: call void @llvm.ubsantrap(i8 22) #[[ATTR3]], !nosanitize [[META2]] | ||
| // TRAP-NEXT: unreachable, !nosanitize [[META2]] | ||
| // TRAP: cont: | ||
| // TRAP-NEXT: [[TMP2:%.*]] = load i32, ptr [[TMP0]], align 4 | ||
| // TRAP-NEXT: ret i32 [[TMP2]] | ||
| // | ||
| // RECOVER-LABEL: define dso_local i32 @null( | ||
| // RECOVER-SAME: ptr noundef [[X:%.*]]) #[[ATTR0]] { | ||
| // RECOVER-NEXT: entry: | ||
| // RECOVER-NEXT: [[X_ADDR:%.*]] = alloca ptr, align 8 | ||
| // RECOVER-NEXT: store ptr [[X]], ptr [[X_ADDR]], align 8 | ||
| // RECOVER-NEXT: [[TMP0:%.*]] = load ptr, ptr [[X_ADDR]], align 8 | ||
| // RECOVER-NEXT: [[TMP1:%.*]] = icmp ne ptr [[TMP0]], null, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: br i1 [[TMP1]], label [[CONT:%.*]], label [[HANDLER_TYPE_MISMATCH:%.*]], !prof [[PROF3]], !nosanitize [[META2]] | ||
| // RECOVER: handler.type_mismatch: | ||
| // RECOVER-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP0]] to i64, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: call void @__ubsan_handle_type_mismatch_v1(ptr @[[GLOB2:[0-9]+]], i64 [[TMP2]]) #[[ATTR3]], !nosanitize [[META2]] | ||
| // RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]] | ||
| // RECOVER: cont: | ||
| // RECOVER-NEXT: [[TMP3:%.*]] = load i32, ptr [[TMP0]], align 4 | ||
| // RECOVER-NEXT: ret i32 [[TMP3]] | ||
| // | ||
| int null(int* x) { | ||
| return *x; | ||
| } | ||
|
|
||
| // CHECK-LABEL: define dso_local i32 @overflow( | ||
| // CHECK-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4 | ||
| // CHECK-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 | ||
| // CHECK-NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4 | ||
| // CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 | ||
| // CHECK-NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4 | ||
| // CHECK-NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]] | ||
| // CHECK-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]] | ||
| // CHECK: handler.add_overflow: | ||
| // CHECK-NEXT: [[TMP6:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]] | ||
| // CHECK-NEXT: [[TMP7:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]] | ||
| // CHECK-NEXT: call void @__ubsan_handle_add_overflow_abort(ptr @[[GLOB3:[0-9]+]], i64 [[TMP6]], i64 [[TMP7]]) #[[ATTR3]], !nosanitize [[META2]] | ||
| // CHECK-NEXT: unreachable, !nosanitize [[META2]] | ||
| // CHECK: cont: | ||
| // CHECK-NEXT: ret i32 [[TMP3]] | ||
| // | ||
| // TRAP-LABEL: define dso_local i32 @overflow( | ||
| // TRAP-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] { | ||
| // TRAP-NEXT: entry: | ||
| // TRAP-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 | ||
| // TRAP-NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4 | ||
| // TRAP-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 | ||
| // TRAP-NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4 | ||
| // TRAP-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 | ||
| // TRAP-NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4 | ||
| // TRAP-NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]] | ||
| // TRAP-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]] | ||
| // TRAP-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]] | ||
| // TRAP-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]] | ||
| // TRAP-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[TRAP:%.*]], !nosanitize [[META2]] | ||
| // TRAP: trap: | ||
| // TRAP-NEXT: call void @llvm.ubsantrap(i8 0) #[[ATTR3]], !nosanitize [[META2]] | ||
| // TRAP-NEXT: unreachable, !nosanitize [[META2]] | ||
| // TRAP: cont: | ||
| // TRAP-NEXT: ret i32 [[TMP3]] | ||
| // | ||
| // RECOVER-LABEL: define dso_local i32 @overflow( | ||
| // RECOVER-SAME: i32 noundef [[X:%.*]], i32 noundef [[Y:%.*]]) #[[ATTR0]] { | ||
| // RECOVER-NEXT: entry: | ||
| // RECOVER-NEXT: [[X_ADDR:%.*]] = alloca i32, align 4 | ||
| // RECOVER-NEXT: [[Y_ADDR:%.*]] = alloca i32, align 4 | ||
| // RECOVER-NEXT: store i32 [[X]], ptr [[X_ADDR]], align 4 | ||
| // RECOVER-NEXT: store i32 [[Y]], ptr [[Y_ADDR]], align 4 | ||
| // RECOVER-NEXT: [[TMP0:%.*]] = load i32, ptr [[X_ADDR]], align 4 | ||
| // RECOVER-NEXT: [[TMP1:%.*]] = load i32, ptr [[Y_ADDR]], align 4 | ||
| // RECOVER-NEXT: [[TMP2:%.*]] = call { i32, i1 } @llvm.sadd.with.overflow.i32(i32 [[TMP0]], i32 [[TMP1]]), !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP3:%.*]] = extractvalue { i32, i1 } [[TMP2]], 0, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP4:%.*]] = extractvalue { i32, i1 } [[TMP2]], 1, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP5:%.*]] = xor i1 [[TMP4]], true, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: br i1 [[TMP5]], label [[CONT:%.*]], label [[HANDLER_ADD_OVERFLOW:%.*]], !prof [[PROF3]], !nosanitize [[META2]] | ||
| // RECOVER: handler.add_overflow: | ||
| // RECOVER-NEXT: [[TMP6:%.*]] = zext i32 [[TMP0]] to i64, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: [[TMP7:%.*]] = zext i32 [[TMP1]] to i64, !nosanitize [[META2]] | ||
| // RECOVER-NEXT: call void @__ubsan_handle_add_overflow(ptr @[[GLOB3:[0-9]+]], i64 [[TMP6]], i64 [[TMP7]]) #[[ATTR3]], !nosanitize [[META2]] | ||
| // RECOVER-NEXT: br label [[CONT]], !nosanitize [[META2]] | ||
| // RECOVER: cont: | ||
| // RECOVER-NEXT: ret i32 [[TMP3]] | ||
| // | ||
| int overflow(int x, int y) { | ||
| return x + y; | ||
| } | ||
| //. | ||
| // CHECK: [[META2]] = !{} | ||
| // CHECK: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1} | ||
| //. | ||
| // TRAP: [[META2]] = !{} | ||
| //. | ||
| // RECOVER: [[META2]] = !{} | ||
| // RECOVER: [[PROF3]] = !{!"branch_weights", i32 1048575, i32 1} | ||
| //. |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| // RUN: %clang_cc1 -triple aarch64_be-apple-darwin -emit-llvm -o - -O1 %s | \ | ||
| // RUN: FileCheck -check-prefixes=CHECK,CHECK-BE %s | ||
| // RUN: %clang_cc1 -triple aarch64-apple-darwin -emit-llvm -o - -O1 %s | \ | ||
| // RUN: FileCheck -check-prefixes=CHECK,CHECK-LE %s | ||
| // | ||
| // Check that TBAA metadata for structs containing bitfields is | ||
| // consistent between big and little endian layouts. | ||
| // | ||
| // FIXME: The metadata below is invalid for the big endian layout: the | ||
| // start offset of 2 is incorrect. | ||
|
|
||
| struct NamedBitfields { | ||
| int f1 : 8; | ||
| int f2 : 8; | ||
| unsigned f3 : 1; | ||
| unsigned f4 : 15; | ||
| int f5; | ||
| double f6; | ||
| }; | ||
|
|
||
| // CHECK-LABEL: _Z4copyP14NamedBitfieldsS0_ | ||
| // CHECK-SAME: ptr nocapture noundef writeonly [[A1:%.*]], ptr nocapture noundef readonly [[A2:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { | ||
| // CHECK-NEXT: entry: | ||
| // CHECK-NEXT: tail call void @llvm.memcpy.p0.p0.i64(ptr noundef nonnull align 8 dereferenceable(16) [[A1]], ptr noundef nonnull align 8 dereferenceable(16) [[A2]], i64 16, i1 false), !tbaa.struct [[TBAA_STRUCT2:![0-9]+]] | ||
| // CHECK-NEXT: ret void | ||
| // | ||
| void copy(NamedBitfields *a1, NamedBitfields *a2) { | ||
| *a1 = *a2; | ||
| } | ||
|
|
||
| // CHECK-BE: [[TBAA_STRUCT2]] = !{i64 2, i64 4, [[META3:![0-9]+]], i64 4, i64 4, [[META6:![0-9]+]], i64 8, i64 8, [[META8:![0-9]+]]} | ||
| // CHECK-LE: [[TBAA_STRUCT2]] = !{i64 0, i64 4, [[META3:![0-9]+]], i64 4, i64 4, [[META6:![0-9]+]], i64 8, i64 8, [[META8:![0-9]+]]} | ||
| // CHECK: [[META3]] = !{[[META4:![0-9]+]], [[META4]], i64 0} | ||
| // CHECK: [[META4]] = !{!"omnipotent char", [[META5:![0-9]+]], i64 0} | ||
| // CHECK: [[META5]] = !{!"Simple C++ TBAA"} | ||
| // CHECK: [[META6]] = !{[[META7:![0-9]+]], [[META7]], i64 0} | ||
| // CHECK: [[META7]] = !{!"int", [[META4]], i64 0} | ||
| // CHECK: [[META8]] = !{[[META9:![0-9]+]], [[META9]], i64 0} | ||
| // CHECK: [[META9]] = !{!"double", [[META4]], i64 0} |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,17 @@ | ||
| // REQUIRES: host-supports-jit, x86_64-linux | ||
| // UNSUPPORTED: system-aix | ||
| // | ||
| // RUN: rm -rf %t | ||
| // RUN: mkdir -p %t | ||
| // RUN: split-file %s %t | ||
| // | ||
| // RUN: cat %t/inline-asm.txt | clang-repl -Xcc="-I%t" | ||
|
|
||
| //--- inline-asm.cpp | ||
| __asm(".globl _ZSt21ios_base_library_initv"); | ||
| int x; | ||
|
|
||
| //--- inline-asm.txt | ||
| #include "inline-asm.cpp" | ||
| x = 10; | ||
| %quit |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,5 @@ | ||
| // RUN: %clang_cc1 -fsyntax-only -verify %s | ||
|
|
||
| typeof_unqual(int) u = 12; // expected-error {{expected function body after function declarator}} | ||
| __typeof_unqual(int) _u = 12; | ||
| __typeof_unqual__(int) __u = 12; |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -5,7 +5,6 @@ build | |
| root | ||
| tags | ||
| TAGS | ||
| .nfs* | ||
| *.sw? | ||
| *~ | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,25 @@ | ||
| //===-- include/flang/Common/windows-include.h ------------------*- C++ -*-===// | ||
| // | ||
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | ||
| // See https://llvm.org/LICENSE.txt for license information. | ||
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
| // | ||
| // Wrapper around windows.h that works around the name conflicts. | ||
| // | ||
| //===----------------------------------------------------------------------===// | ||
|
|
||
| #ifndef FORTRAN_COMMON_WINDOWS_INCLUDE_H_ | ||
| #define FORTRAN_COMMON_WINDOWS_INCLUDE_H_ | ||
|
|
||
| #ifdef _WIN32 | ||
|
|
||
| #define WIN32_LEAN_AND_MEAN | ||
| #define NOMINMAX | ||
|
|
||
| #include <windows.h> | ||
|
|
||
| #endif // _WIN32 | ||
|
|
||
| #endif // FORTRAN_COMMON_WINDOWS_INCLUDE_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1 @@ | ||
| #!/bin/true |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,21 @@ | ||
| !! Test that --gcc-toolchain and --gcc-install-dir options are working as expected. | ||
| !! It does not test cross-compiling (--sysroot), so crtbegin.o, libgcc/compiler-rt, libc, libFortranRuntime, etc. are not supposed to be affected. | ||
| !! PREFIX is captured twice because the driver escapes backslashes (occuring in Windows paths) in the -### output, but not on the "Selected GCC installation:" line. | ||
|
|
||
| ! RUN: %flang 2>&1 -### -v -o %t %s -no-integrated-as -fuse-ld=ld --target=i386-unknown-linux-gnu --gcc-install-dir=%S/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0 | FileCheck %s --check-prefix=CHECK-I386 | ||
| ! RUN: %flang 2>&1 -### -v -o %t %s -no-integrated-as -fuse-ld=ld --target=i386-unknown-linux-gnu --gcc-toolchain=%S/Inputs/basic_cross_linux_tree/usr | FileCheck %s --check-prefix=CHECK-I386 | ||
| ! CHECK-I386: Selected GCC installation: [[PREFIX:[^"]+]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0 | ||
| ! CHECK-I386: "-fc1" "-triple" "i386-unknown-linux-gnu" | ||
| ! CHECK-I386: "[[PREFIX:[^"]+]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0/../../../../i386-unknown-linux-gnu/bin{{/|\\\\}}as" | ||
| ! CHECK-I386: "[[PREFIX]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0/../../../../i386-unknown-linux-gnu/bin{{/|\\\\}}ld" {{.*}} "-m" "elf_i386" | ||
| ! CHECK-I386-SAME: "-L[[PREFIX]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0" | ||
| ! CHECK-I386-SAME: "-L[[PREFIX]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/i386-unknown-linux-gnu/10.2.0/../../../../i386-unknown-linux-gnu/lib" | ||
|
|
||
| ! RUN: %flang 2>&1 -### -v -o %t %s -no-integrated-as -fuse-ld=ld --target=x86_64-unknown-linux-gnu --gcc-install-dir=%S/Inputs/basic_cross_linux_tree/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0 | FileCheck %s --check-prefix=CHECK-X86-64 | ||
| ! RUN: %flang 2>&1 -### -v -o %t %s -no-integrated-as -fuse-ld=ld --target=x86_64-unknown-linux-gnu --gcc-toolchain=%S/Inputs/basic_cross_linux_tree/usr | FileCheck %s --check-prefix=CHECK-X86-64 | ||
| ! CHECK-X86-64: Selected GCC installation: [[PREFIX:[^"]+]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0 | ||
| ! CHECK-X86-64: "-fc1" "-triple" "x86_64-unknown-linux-gnu" | ||
| ! CHECK-X86-64: "[[PREFIX:[^"]+]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/bin{{/|\\\\}}as" "--64" | ||
| ! CHECK-X86-64: "[[PREFIX]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/bin{{/|\\\\}}ld" {{.*}} "-m" "elf_x86_64" | ||
| ! CHECK-X86-64-SAME: "-L[[PREFIX]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0" | ||
| ! CHECK-X86-64-SAME: "-L[[PREFIX]]/Inputs/basic_cross_linux_tree/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/lib" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,125 @@ | ||
| ! NOTE: Assertions have been autogenerated by utils/generate-test-checks.py | ||
|
|
||
| ! The script is designed to make adding checks to | ||
| ! a test case fast, it is *not* designed to be authoritative | ||
| ! about what constitutes a good test! The CHECK should be | ||
| ! minimized and named to reflect the test intent. | ||
|
|
||
| ! RUN: bbc -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s | ||
| ! RUN: %flang_fc1 -emit-hlfir -fopenmp -o - %s 2>&1 | FileCheck %s | ||
|
|
||
|
|
||
|
|
||
| ! CHECK-LABEL: omp.declare_reduction @add_reduction_byref_box_Uxi32 : !fir.ref<!fir.box<!fir.array<?xi32>>> init { | ||
| ! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>): | ||
| ! CHECK: %[[VAL_1:.*]] = arith.constant 0 : i32 | ||
| ! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: %[[VAL_3:.*]] = arith.constant 0 : index | ||
| ! CHECK: %[[VAL_4:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_3]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) | ||
| ! CHECK: %[[VAL_5:.*]] = fir.shape %[[VAL_4]]#1 : (index) -> !fir.shape<1> | ||
| ! CHECK: %[[VAL_6:.*]] = fir.alloca !fir.array<?xi32>, %[[VAL_4]]#1 {bindc_name = ".tmp"} | ||
| ! CHECK: %[[VAL_7:.*]]:2 = hlfir.declare %[[VAL_6]](%[[VAL_5]]) {uniq_name = ".tmp"} : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<?xi32>>) | ||
| ! CHECK: hlfir.assign %[[VAL_1]] to %[[VAL_7]]#0 : i32, !fir.box<!fir.array<?xi32>> | ||
| ! CHECK: %[[VAL_8:.*]] = fir.alloca !fir.box<!fir.array<?xi32>> | ||
| ! CHECK: fir.store %[[VAL_7]]#0 to %[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: omp.yield(%[[VAL_8]] : !fir.ref<!fir.box<!fir.array<?xi32>>>) | ||
|
|
||
| ! CHECK-LABEL: } combiner { | ||
| ! CHECK: ^bb0(%[[VAL_0:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>, %[[VAL_1:.*]]: !fir.ref<!fir.box<!fir.array<?xi32>>>): | ||
| ! CHECK: %[[VAL_2:.*]] = fir.load %[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: %[[VAL_3:.*]] = fir.load %[[VAL_1]] : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: %[[VAL_4:.*]] = arith.constant 0 : index | ||
| ! CHECK: %[[VAL_5:.*]]:3 = fir.box_dims %[[VAL_2]], %[[VAL_4]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) | ||
| ! CHECK: %[[VAL_6:.*]] = fir.shape_shift %[[VAL_5]]#0, %[[VAL_5]]#1 : (index, index) -> !fir.shapeshift<1> | ||
| ! CHECK: %[[VAL_7:.*]] = arith.constant 1 : index | ||
| ! CHECK: fir.do_loop %[[VAL_8:.*]] = %[[VAL_7]] to %[[VAL_5]]#1 step %[[VAL_7]] unordered { | ||
| ! CHECK: %[[VAL_9:.*]] = fir.array_coor %[[VAL_2]](%[[VAL_6]]) %[[VAL_8]] : (!fir.box<!fir.array<?xi32>>, !fir.shapeshift<1>, index) -> !fir.ref<i32> | ||
| ! CHECK: %[[VAL_10:.*]] = fir.array_coor %[[VAL_3]](%[[VAL_6]]) %[[VAL_8]] : (!fir.box<!fir.array<?xi32>>, !fir.shapeshift<1>, index) -> !fir.ref<i32> | ||
| ! CHECK: %[[VAL_11:.*]] = fir.load %[[VAL_9]] : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_12:.*]] = fir.load %[[VAL_10]] : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_13:.*]] = arith.addi %[[VAL_11]], %[[VAL_12]] : i32 | ||
| ! CHECK: fir.store %[[VAL_13]] to %[[VAL_9]] : !fir.ref<i32> | ||
| ! CHECK: } | ||
| ! CHECK: omp.yield(%[[VAL_0]] : !fir.ref<!fir.box<!fir.array<?xi32>>>) | ||
| ! CHECK: } | ||
|
|
||
| ! CHECK-LABEL: func.func @_QPs( | ||
| ! CHECK-SAME: %[[VAL_0:.*]]: !fir.ref<i32> {fir.bindc_name = "x"}) { | ||
| ! CHECK: %[[VAL_1:.*]]:2 = hlfir.declare %[[VAL_0]] {uniq_name = "_QFsEx"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
| ! CHECK: %[[VAL_2:.*]] = fir.alloca i32 {bindc_name = "i", uniq_name = "_QFsEi"} | ||
| ! CHECK: %[[VAL_3:.*]]:2 = hlfir.declare %[[VAL_2]] {uniq_name = "_QFsEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
| ! CHECK: %[[VAL_4:.*]] = fir.load %[[VAL_1]]#0 : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_5:.*]] = fir.convert %[[VAL_4]] : (i32) -> i64 | ||
| ! CHECK: %[[VAL_6:.*]] = fir.convert %[[VAL_5]] : (i64) -> index | ||
| ! CHECK: %[[VAL_7:.*]] = arith.constant 0 : index | ||
| ! CHECK: %[[VAL_8:.*]] = arith.cmpi sgt, %[[VAL_6]], %[[VAL_7]] : index | ||
| ! CHECK: %[[VAL_9:.*]] = arith.select %[[VAL_8]], %[[VAL_6]], %[[VAL_7]] : index | ||
| ! CHECK: %[[VAL_10:.*]] = fir.alloca !fir.array<?xi32>, %[[VAL_9]] {bindc_name = "c", uniq_name = "_QFsEc"} | ||
| ! CHECK: %[[VAL_11:.*]] = fir.shape %[[VAL_9]] : (index) -> !fir.shape<1> | ||
| ! CHECK: %[[VAL_12:.*]]:2 = hlfir.declare %[[VAL_10]](%[[VAL_11]]) {uniq_name = "_QFsEc"} : (!fir.ref<!fir.array<?xi32>>, !fir.shape<1>) -> (!fir.box<!fir.array<?xi32>>, !fir.ref<!fir.array<?xi32>>) | ||
| ! CHECK: %[[VAL_13:.*]] = arith.constant 0 : i32 | ||
| ! CHECK: hlfir.assign %[[VAL_13]] to %[[VAL_12]]#0 : i32, !fir.box<!fir.array<?xi32>> | ||
| ! CHECK: omp.parallel { | ||
| ! CHECK: %[[VAL_14:.*]] = fir.alloca i32 {adapt.valuebyref, pinned} | ||
| ! CHECK: %[[VAL_15:.*]]:2 = hlfir.declare %[[VAL_14]] {uniq_name = "_QFsEi"} : (!fir.ref<i32>) -> (!fir.ref<i32>, !fir.ref<i32>) | ||
| ! CHECK: %[[VAL_16:.*]] = arith.constant 1 : i32 | ||
| ! CHECK: %[[VAL_17:.*]] = arith.constant 100 : i32 | ||
| ! CHECK: %[[VAL_18:.*]] = arith.constant 1 : i32 | ||
| ! CHECK: %[[VAL_19:.*]] = fir.alloca !fir.box<!fir.array<?xi32>> | ||
| ! CHECK: fir.store %[[VAL_12]]#0 to %[[VAL_19]] : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: omp.wsloop byref reduction(@add_reduction_byref_box_Uxi32 %[[VAL_19]] -> %[[VAL_20:.*]] : !fir.ref<!fir.box<!fir.array<?xi32>>>) for (%[[VAL_21:.*]]) : i32 = (%[[VAL_16]]) to (%[[VAL_17]]) inclusive step (%[[VAL_18]]) { | ||
| ! CHECK: fir.store %[[VAL_21]] to %[[VAL_15]]#1 : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_22:.*]]:2 = hlfir.declare %[[VAL_20]] {uniq_name = "_QFsEc"} : (!fir.ref<!fir.box<!fir.array<?xi32>>>) -> (!fir.ref<!fir.box<!fir.array<?xi32>>>, !fir.ref<!fir.box<!fir.array<?xi32>>>) | ||
| ! CHECK: %[[VAL_23:.*]] = fir.load %[[VAL_22]]#0 : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: %[[VAL_24:.*]] = fir.load %[[VAL_15]]#0 : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_25:.*]] = arith.constant 0 : index | ||
| ! CHECK: %[[VAL_26:.*]]:3 = fir.box_dims %[[VAL_23]], %[[VAL_25]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) | ||
| ! CHECK: %[[VAL_27:.*]] = fir.shape %[[VAL_26]]#1 : (index) -> !fir.shape<1> | ||
| ! CHECK: %[[VAL_28:.*]] = hlfir.elemental %[[VAL_27]] unordered : (!fir.shape<1>) -> !hlfir.expr<?xi32> { | ||
| ! CHECK: ^bb0(%[[VAL_29:.*]]: index): | ||
| ! CHECK: %[[VAL_30:.*]] = arith.constant 0 : index | ||
| ! CHECK: %[[VAL_31:.*]]:3 = fir.box_dims %[[VAL_23]], %[[VAL_30]] : (!fir.box<!fir.array<?xi32>>, index) -> (index, index, index) | ||
| ! CHECK: %[[VAL_32:.*]] = arith.constant 1 : index | ||
| ! CHECK: %[[VAL_33:.*]] = arith.subi %[[VAL_31]]#0, %[[VAL_32]] : index | ||
| ! CHECK: %[[VAL_34:.*]] = arith.addi %[[VAL_29]], %[[VAL_33]] : index | ||
| ! CHECK: %[[VAL_35:.*]] = hlfir.designate %[[VAL_23]] (%[[VAL_34]]) : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32> | ||
| ! CHECK: %[[VAL_36:.*]] = fir.load %[[VAL_35]] : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_37:.*]] = arith.addi %[[VAL_36]], %[[VAL_24]] : i32 | ||
| ! CHECK: hlfir.yield_element %[[VAL_37]] : i32 | ||
| ! CHECK: } | ||
| ! CHECK: %[[VAL_38:.*]] = fir.load %[[VAL_22]]#0 : !fir.ref<!fir.box<!fir.array<?xi32>>> | ||
| ! CHECK: hlfir.assign %[[VAL_28]] to %[[VAL_38]] : !hlfir.expr<?xi32>, !fir.box<!fir.array<?xi32>> | ||
| ! CHECK: hlfir.destroy %[[VAL_28]] : !hlfir.expr<?xi32> | ||
| ! CHECK: omp.yield | ||
| ! CHECK: } | ||
| ! CHECK: omp.terminator | ||
| ! CHECK: } | ||
| ! CHECK: %[[VAL_39:.*]] = arith.constant 1 : index | ||
| ! CHECK: %[[VAL_40:.*]] = hlfir.designate %[[VAL_12]]#0 (%[[VAL_39]]) : (!fir.box<!fir.array<?xi32>>, index) -> !fir.ref<i32> | ||
| ! CHECK: %[[VAL_41:.*]] = fir.load %[[VAL_40]] : !fir.ref<i32> | ||
| ! CHECK: %[[VAL_42:.*]] = arith.constant 5050 : i32 | ||
| ! CHECK: %[[VAL_43:.*]] = arith.cmpi ne, %[[VAL_41]], %[[VAL_42]] : i32 | ||
| ! CHECK: cf.cond_br %[[VAL_43]], ^bb1, ^bb2 | ||
| ! CHECK: ^bb1: | ||
| ! CHECK: %[[VAL_44:.*]] = arith.constant 1 : i32 | ||
| ! CHECK: %[[VAL_45:.*]] = arith.constant false | ||
| ! CHECK: %[[VAL_46:.*]] = arith.constant false | ||
| ! CHECK: %[[VAL_47:.*]] = fir.call @_FortranAStopStatement(%[[VAL_44]], %[[VAL_45]], %[[VAL_46]]) fastmath<contract> : (i32, i1, i1) -> none | ||
| ! CHECK: fir.unreachable | ||
| ! CHECK: ^bb2: | ||
| ! CHECK: return | ||
| ! CHECK: } | ||
| ! CHECK: func.func private @_FortranAStopStatement(i32, i1, i1) -> none attributes {fir.runtime} | ||
|
|
||
| subroutine s(x) | ||
| integer :: x | ||
| integer :: c(x) | ||
| c = 0 | ||
| !$omp parallel do reduction(+:c) | ||
| do i = 1, 100 | ||
| c = c + i | ||
| end do | ||
| !$omp end parallel do | ||
|
|
||
| if (c(1) /= 5050) stop 1 | ||
| end subroutine s |