35 changes: 23 additions & 12 deletions clang/test/CodeGenCXX/default_calling_conv.cpp
Original file line number Diff line number Diff line change
@@ -1,43 +1,50 @@
// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -fdefault-calling-conv=cdecl -emit-llvm -o - %s | FileCheck %s --check-prefix=CDECL --check-prefix=ALL
// RUN: %clang_cc1 -triple i786-unknown-linux-gnu -target-feature +sse4.2 -fdefault-calling-conv=fastcall -emit-llvm -o - %s | FileCheck %s --check-prefix=FASTCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i486-unknown-linux-gnu -fdefault-calling-conv=stdcall -emit-llvm -o - %s | FileCheck %s --check-prefix=STDCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i486-unknown-linux-gnu -mrtd -emit-llvm -o - %s | FileCheck %s --check-prefix=STDCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i986-unknown-linux-gnu -fdefault-calling-conv=vectorcall -emit-llvm -o - %s | FileCheck %s --check-prefix=VECTORCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i986-unknown-linux-gnu -fdefault-calling-conv=regcall -emit-llvm -o - %s | FileCheck %s --check-prefix=REGCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple i386-unknown-linux-gnu -fdefault-calling-conv=cdecl -emit-llvm -o - %s | FileCheck %s --check-prefix=CDECL --check-prefix=X86 --check-prefix=ALL
// RUN: %clang_cc1 -triple i786-unknown-linux-gnu -target-feature +sse4.2 -fdefault-calling-conv=fastcall -emit-llvm -o - %s | FileCheck %s --check-prefix=FASTCALL --check-prefix=X86 --check-prefix=ALL
// RUN: %clang_cc1 -triple i486-unknown-linux-gnu -fdefault-calling-conv=stdcall -emit-llvm -o - %s | FileCheck %s --check-prefix=STDCALL --check-prefix=X86 --check-prefix=ALL
// RUN: %clang_cc1 -triple i486-unknown-linux-gnu -mrtd -emit-llvm -o - %s | FileCheck %s --check-prefix=STDCALL --check-prefix=X86 --check-prefix=ALL
// RUN: %clang_cc1 -triple i986-unknown-linux-gnu -fdefault-calling-conv=vectorcall -emit-llvm -o - %s | FileCheck %s --check-prefix=VECTORCALL --check-prefix=X86 --check-prefix=ALL
// RUN: %clang_cc1 -triple i986-unknown-linux-gnu -fdefault-calling-conv=regcall -emit-llvm -o - %s | FileCheck %s --check-prefix=REGCALL --check-prefix=X86 --check-prefix=ALL
// RUN: %clang_cc1 -triple i686-pc-win32 -fdefault-calling-conv=vectorcall -emit-llvm -o - %s -DWINDOWS | FileCheck %s --check-prefix=WIN32
// RUN: %clang_cc1 -triple x86_64-windows-msvc -fdefault-calling-conv=vectorcall -emit-llvm -o - %s -DWINDOWS | FileCheck %s --check-prefix=WIN64
// RUN: %clang_cc1 -triple i686-pc-win32 -emit-llvm -o - %s -DEXPLICITCC | FileCheck %s --check-prefix=EXPLICITCC
// RUN: %clang_cc1 -triple m68k-unknown-linux-gnu -mrtd -emit-llvm -o - %s | FileCheck %s --check-prefix=RTDCALL --check-prefix=ALL
// RUN: %clang_cc1 -triple m68k-unknown-linux-gnu -fdefault-calling-conv=rtdcall -emit-llvm -o - %s | FileCheck %s --check-prefix=RTDCALL --check-prefix=ALL

// CDECL: define{{.*}} void @_Z5test1v
// FASTCALL: define{{.*}} x86_fastcallcc void @_Z5test1v
// STDCALL: define{{.*}} x86_stdcallcc void @_Z5test1v
// VECTORCALL: define{{.*}} x86_vectorcallcc void @_Z5test1v
// REGCALL: define{{.*}} x86_regcallcc void @_Z17__regcall3__test1v
// RTDCALL: define{{.*}} m68k_rtdcc void @_Z5test1v
void test1() {}

// fastcall, stdcall, vectorcall and regcall do not support variadic functions.
// fastcall, stdcall, vectorcall, regcall and m68k_rtd do not support variadic functions.
// CDECL: define{{.*}} void @_Z12testVariadicz
// FASTCALL: define{{.*}} void @_Z12testVariadicz
// STDCALL: define{{.*}} void @_Z12testVariadicz
// VECTORCALL: define{{.*}} void @_Z12testVariadicz
// REGCALL: define{{.*}} void @_Z12testVariadicz
// RTDCALL: define{{.*}} void @_Z12testVariadicz
void testVariadic(...){}

// ALL: define{{.*}} void @_Z5test2v
// X86: define{{.*}} void @_Z5test2v
void __attribute__((cdecl)) test2() {}

// ALL: define{{.*}} x86_fastcallcc void @_Z5test3v
// X86: define{{.*}} x86_fastcallcc void @_Z5test3v
void __attribute__((fastcall)) test3() {}

// ALL: define{{.*}} x86_stdcallcc void @_Z5test4v
// X86: define{{.*}} x86_stdcallcc void @_Z5test4v
void __attribute__((stdcall)) test4() {}

// ALL: define{{.*}} x86_vectorcallcc void @_Z5test5v
// X86: define{{.*}} x86_vectorcallcc void @_Z5test5v
void __attribute__((vectorcall)) test5() {}

// ALL: define{{.*}} x86_regcallcc void @_Z17__regcall3__test6v
// X86: define{{.*}} x86_regcallcc void @_Z17__regcall3__test6v
void __attribute__((regcall)) test6() {}

// RTDCALL: define{{.*}} m68k_rtdcc void @_Z5test7v
void __attribute__((m68k_rtd)) test7() {}

// ALL: define linkonce_odr void @_ZN1A11test_memberEv
class A {
public:
Expand All @@ -47,6 +54,10 @@ class A {
void test() {
A a;
a.test_member();

// ALL: define internal void @"_ZZ{{.*}}testvENK3$_0clEi"
auto f = [](int b) {};
f(87);
}

// ALL: define{{.*}} i32 @main
Expand Down
16 changes: 16 additions & 0 deletions clang/test/CodeGenCXX/m68k-rtdcall.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
// RUN: %clang_cc1 -triple m68k-linux-gnu -emit-llvm -o - %s | FileCheck %s

class A {
public:
// CHECK: define{{.*}} m68k_rtdcc void @_ZN1A6memberEv
void __attribute__((m68k_rtd)) member() {}
};

void test() {
A a;
a.member();

// CHECK: define{{.*}} m68k_rtdcc void @"_ZZ4testvENK3$_0clEi"
auto f = [](int b) __attribute__((m68k_rtd)) {};
f(87);
};
46 changes: 46 additions & 0 deletions clang/test/Sema/m68k-rtdcall.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
// RUN: %clang_cc1 -triple m68k-unknown-unknown -mrtd -std=c89 -verify -verify=rtd %s
// RUN: %clang_cc1 -triple m68k-unknown-unknown -std=c89 -verify -verify=nortd %s

// rtd-error@+2 {{function with no prototype cannot use the m68k_rtd calling convention}}
void foo(int arg) {
bar(arg);
}

// nortd-note@+4 {{previous declaration is here}}
// nortd-error@+4 {{function declared 'm68k_rtd' here was previously declared without calling convention}}
// nortd-note@+4 {{previous declaration is here}}
// nortd-error@+4 {{function declared 'm68k_rtd' here was previously declared without calling convention}}
void nonvariadic1(int a, int b, int c);
void __attribute__((m68k_rtd)) nonvariadic1(int a, int b, int c);
void nonvariadic2(int a, int b, int c);
void __attribute__((m68k_rtd)) nonvariadic2(int a, int b, int c) { }

// expected-error@+2 {{variadic function cannot use m68k_rtd calling convention}}
void variadic(int a, ...);
void __attribute__((m68k_rtd)) variadic(int a, ...);

// rtd-note@+2 {{previous declaration is here}}
// rtd-error@+2 {{redeclaration of 'a' with a different type: 'void ((*))(int, int) __attribute__((cdecl))' vs 'void (*)(int, int) __attribute__((m68k_rtd))'}}
extern void (*a)(int, int);
__attribute__((cdecl)) extern void (*a)(int, int);

extern void (*b)(int, ...);
__attribute__((cdecl)) extern void (*b)(int, ...);

// nortd-note@+2 {{previous declaration is here}}
// nortd-error@+2 {{redeclaration of 'c' with a different type: 'void ((*))(int, int) __attribute__((m68k_rtd))' vs 'void (*)(int, int)'}}
extern void (*c)(int, int);
__attribute__((m68k_rtd)) extern void (*c)(int, int);

// expected-error@+2 {{variadic function cannot use m68k_rtd calling convention}}
extern void (*d)(int, ...);
__attribute__((m68k_rtd)) extern void (*d)(int, ...);

// expected-warning@+1 {{'m68k_rtd' only applies to function types; type here is 'int'}}
__attribute__((m68k_rtd)) static int g = 0;

// expected-error@+1 {{'m68k_rtd' attribute takes no arguments}}
void __attribute__((m68k_rtd("invalid"))) z(int a);

// expected-error@+1 {{function with no prototype cannot use the m68k_rtd calling convention}}
void __attribute__((m68k_rtd)) e();
14 changes: 14 additions & 0 deletions clang/test/SemaCXX/m68k-rtdcall.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// RUN: %clang_cc1 -triple m68k-linux-gnu -fsyntax-only %s

class A {
public:
void __attribute__((m68k_rtd)) member() {}
};

void test() {
A a;
a.member();

auto f = [](int b) __attribute__((m68k_rtd)) {};
f(87);
};
1 change: 1 addition & 0 deletions clang/tools/libclang/CXType.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -678,6 +678,7 @@ CXCallingConv clang_getFunctionTypeCallingConv(CXType X) {
TCALLINGCONV(SwiftAsync);
TCALLINGCONV(PreserveMost);
TCALLINGCONV(PreserveAll);
TCALLINGCONV(M68kRTD);
case CC_SpirFunction: return CXCallingConv_Unexposed;
case CC_AMDGPUKernelCall: return CXCallingConv_Unexposed;
case CC_OpenCLKernel: return CXCallingConv_Unexposed;
Expand Down
1 change: 1 addition & 0 deletions llvm/include/llvm/AsmParser/LLToken.h
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ enum Kind {
kw_amdgpu_kernel,
kw_amdgpu_gfx,
kw_tailcc,
kw_m68k_rtdcc,

// Attributes:
kw_attributes,
Expand Down
1 change: 1 addition & 0 deletions llvm/include/llvm/BinaryFormat/Dwarf.def
Original file line number Diff line number Diff line change
Expand Up @@ -1036,6 +1036,7 @@ HANDLE_DW_CC(0xc8, LLVM_Swift)
HANDLE_DW_CC(0xc9, LLVM_PreserveMost)
HANDLE_DW_CC(0xca, LLVM_PreserveAll)
HANDLE_DW_CC(0xcb, LLVM_X86RegCall)
HANDLE_DW_CC(0xcc, LLVM_M68kRTD)
// From GCC source code (include/dwarf2.h): This DW_CC_ value is not currently
// generated by any toolchain. It is used internally to GDB to indicate OpenCL
// C functions that have been compiled with the IBM XL C for OpenCL compiler and
Expand Down
3 changes: 3 additions & 0 deletions llvm/include/llvm/IR/CallingConv.h
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,9 @@ namespace CallingConv {
/// placement. Preserves active lane values for input VGPRs.
AMDGPU_CS_ChainPreserve = 105,

/// Used for M68k rtd-based CC (similar to X86's stdcall).
M68k_RTD = 106,

/// The highest possible ID. Must be some 2^k - 1.
MaxID = 1023
};
Expand Down
1 change: 1 addition & 0 deletions llvm/lib/AsmParser/LLLexer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -632,6 +632,7 @@ lltok::Kind LLLexer::LexIdentifier() {
KEYWORD(amdgpu_kernel);
KEYWORD(amdgpu_gfx);
KEYWORD(tailcc);
KEYWORD(m68k_rtdcc);

KEYWORD(cc);
KEYWORD(c);
Expand Down
2 changes: 2 additions & 0 deletions llvm/lib/AsmParser/LLParser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1999,6 +1999,7 @@ void LLParser::parseOptionalDLLStorageClass(unsigned &Res) {
/// ::= 'amdgpu_cs_chain_preserve'
/// ::= 'amdgpu_kernel'
/// ::= 'tailcc'
/// ::= 'm68k_rtdcc'
/// ::= 'cc' UINT
///
bool LLParser::parseOptionalCallingConv(unsigned &CC) {
Expand Down Expand Up @@ -2067,6 +2068,7 @@ bool LLParser::parseOptionalCallingConv(unsigned &CC) {
break;
case lltok::kw_amdgpu_kernel: CC = CallingConv::AMDGPU_KERNEL; break;
case lltok::kw_tailcc: CC = CallingConv::Tail; break;
case lltok::kw_m68k_rtdcc: CC = CallingConv::M68k_RTD; break;
case lltok::kw_cc: {
Lex.Lex();
return parseUInt32(CC);
Expand Down
3 changes: 3 additions & 0 deletions llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -620,6 +620,9 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
case CallingConvention::DW_CC_LLVM_X86RegCall:
OS << " __attribute__((regcall))";
break;
case CallingConvention::DW_CC_LLVM_M68kRTD:
OS << " __attribute__((m68k_rtd))";
break;
}
}

Expand Down
1 change: 1 addition & 0 deletions llvm/lib/IR/AsmWriter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -350,6 +350,7 @@ static void PrintCallingConv(unsigned cc, raw_ostream &Out) {
break;
case CallingConv::AMDGPU_KERNEL: Out << "amdgpu_kernel"; break;
case CallingConv::AMDGPU_Gfx: Out << "amdgpu_gfx"; break;
case CallingConv::M68k_RTD: Out << "m68k_rtdcc"; break;
}
}

Expand Down
36 changes: 13 additions & 23 deletions llvm/lib/Target/M68k/M68kExpandPseudo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -258,32 +258,22 @@ bool M68kExpandPseudo::ExpandMI(MachineBasicBlock &MBB,

if (StackAdj == 0) {
MIB = BuildMI(MBB, MBBI, DL, TII->get(M68k::RTS));
} else if (isUInt<16>(StackAdj)) {

if (STI->atLeastM68020()) {
llvm_unreachable("RTD is not implemented");
} else {
// Copy PC from stack to a free address(A0 or A1) register
// TODO check if pseudo expand uses free address register
BuildMI(MBB, MBBI, DL, TII->get(M68k::MOV32aj), M68k::A1)
.addReg(M68k::SP);
} else {
// Copy return address from stack to a free address(A0 or A1) register
// TODO check if pseudo expand uses free address register
BuildMI(MBB, MBBI, DL, TII->get(M68k::MOV32aj), M68k::A1)
.addReg(M68k::SP);

// Adjust SP
FL->emitSPUpdate(MBB, MBBI, StackAdj, /*InEpilogue=*/true);
// Adjust SP
FL->emitSPUpdate(MBB, MBBI, StackAdj, /*InEpilogue=*/true);

// Put the return address on stack
BuildMI(MBB, MBBI, DL, TII->get(M68k::MOV32ja))
.addReg(M68k::SP)
.addReg(M68k::A1);
// Put the return address on stack
BuildMI(MBB, MBBI, DL, TII->get(M68k::MOV32ja))
.addReg(M68k::SP)
.addReg(M68k::A1);

// RTS
BuildMI(MBB, MBBI, DL, TII->get(M68k::RTS));
}
} else {
// TODO: RTD can only handle immediates as big as 2**16-1.
// If we need to pop off bytes before the return address, we
// must do it manually.
llvm_unreachable("Stack adjustment size not supported");
// RTS
BuildMI(MBB, MBBI, DL, TII->get(M68k::RTS));
}

// FIXME: Can rest of the operands be ignored, if there is any?
Expand Down
5 changes: 2 additions & 3 deletions llvm/lib/Target/M68k/M68kISelLowering.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3050,9 +3050,8 @@ M68kTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,

/// Determines whether the callee is required to pop its own arguments.
/// Callee pop is necessary to support tail calls.
bool M68k::isCalleePop(CallingConv::ID CallingConv, bool IsVarArg,
bool GuaranteeTCO) {
return false;
bool M68k::isCalleePop(CallingConv::ID CC, bool IsVarArg, bool GuaranteeTCO) {
return CC == CallingConv::M68k_RTD && !IsVarArg;
}

// Return true if it is OK for this CMOV pseudo-opcode to be cascaded
Expand Down
48 changes: 48 additions & 0 deletions llvm/test/CodeGen/M68k/CConv/rtd-call.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=m68k %s -stop-after=finalize-isel -o - | FileCheck %s

; We want to make sure caller doesn't pop the stack for callees using
; the M68k_RTD CC. However, we've implemented some frame optimization
; techniques to eliminate as many as frame setup/destroy instructions.
; Therefore, to make test case small and concise, we check the MIR generated
; after ISel instead.

declare dso_local m68k_rtdcc void @callee(i32 noundef)
declare dso_local m68k_rtdcc void @va_callee(i32 noundef, ...)

define dso_local i32 @caller(ptr noundef %y) {
; CHECK-LABEL: name: caller
; CHECK: bb.0.entry:
; CHECK-NEXT: [[MOV32rp:%[0-9]+]]:ar32 = MOV32rp 0, %fixed-stack.0, implicit-def dead $ccr :: (load (s32) from %fixed-stack.0, align 8)
; CHECK-NEXT: [[MOV32rj:%[0-9]+]]:xr32 = MOV32rj killed [[MOV32rp]], implicit-def dead $ccr :: (load (s32) from %ir.y)
; CHECK-NEXT: ADJCALLSTACKDOWN 4, 0, implicit-def dead $sp, implicit-def dead $ccr, implicit $sp
; CHECK-NEXT: [[COPY:%[0-9]+]]:ar32 = COPY $sp
; CHECK-NEXT: MOV32jr [[COPY]], [[MOV32rj]], implicit-def dead $ccr :: (store (s32) into stack, align 2)
; CHECK-NEXT: CALLb @callee, csr_std, implicit $sp, implicit-def $sp
; CHECK-NEXT: ADJCALLSTACKUP 4, 4, implicit-def dead $sp, implicit-def dead $ccr, implicit $sp
; CHECK-NEXT: $d0 = COPY [[MOV32rj]]
; CHECK-NEXT: RET 0, $d0
entry:
%0 = load i32, ptr %y, align 4
call m68k_rtdcc void @callee(i32 noundef %0)
ret i32 %0
}

define dso_local i32 @va_caller(ptr noundef %y) {
; CHECK-LABEL: name: va_caller
; CHECK: bb.0.entry:
; CHECK-NEXT: [[MOV32rp:%[0-9]+]]:ar32 = MOV32rp 0, %fixed-stack.0, implicit-def dead $ccr :: (load (s32) from %fixed-stack.0, align 8)
; CHECK-NEXT: [[MOV32rj:%[0-9]+]]:xr32 = MOV32rj killed [[MOV32rp]], implicit-def dead $ccr :: (load (s32) from %ir.y)
; CHECK-NEXT: ADJCALLSTACKDOWN 4, 0, implicit-def dead $sp, implicit-def dead $ccr, implicit $sp
; CHECK-NEXT: [[COPY:%[0-9]+]]:ar32 = COPY $sp
; CHECK-NEXT: MOV32jr [[COPY]], [[MOV32rj]], implicit-def dead $ccr :: (store (s32) into stack, align 2)
; CHECK-NEXT: CALLb @va_callee, csr_std, implicit $sp, implicit-def $sp
; CHECK-NEXT: ADJCALLSTACKUP 4, 0, implicit-def dead $sp, implicit-def dead $ccr, implicit $sp
; CHECK-NEXT: $d0 = COPY [[MOV32rj]]
; CHECK-NEXT: RET 0, $d0
entry:
%0 = load i32, ptr %y, align 4
call m68k_rtdcc void (i32, ...) @va_callee(i32 noundef %0)
ret i32 %0
}

31 changes: 31 additions & 0 deletions llvm/test/CodeGen/M68k/CConv/rtd-ret.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
; RUN: llc -mtriple=m68k < %s | FileCheck %s

define dso_local m68k_rtdcc i32 @ret(i32 noundef %a, i32 noundef %b, i32 noundef %c) nounwind {
; CHECK-LABEL: ret:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: move.l (8,%sp), %d0
; CHECK-NEXT: add.l (4,%sp), %d0
; CHECK-NEXT: add.l (12,%sp), %d0
; CHECK-NEXT: move.l (%sp), %a1
; CHECK-NEXT: adda.l #12, %sp
; CHECK-NEXT: move.l %a1, (%sp)
; CHECK-NEXT: rts
entry:
%add = add nsw i32 %b, %a
%add1 = add nsw i32 %add, %c
ret i32 %add1
}

define dso_local m68k_rtdcc i32 @va_ret(i32 noundef %a, i32 noundef %b, i32 noundef %c, ...) nounwind {
; CHECK-LABEL: va_ret:
; CHECK: ; %bb.0: ; %entry
; CHECK-NEXT: move.l (8,%sp), %d0
; CHECK-NEXT: add.l (4,%sp), %d0
; CHECK-NEXT: add.l (12,%sp), %d0
; CHECK-NEXT: rts
entry:
%add = add nsw i32 %b, %a
%add1 = add nsw i32 %add, %c
ret i32 %add1
}
21 changes: 21 additions & 0 deletions llvm/test/DebugInfo/M68k/calling-convention.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
; RUN: llc --mtriple=m68k -filetype=obj %s -o %t
; RUN: llvm-dwarfdump -v %t | FileCheck %s

; CHECK-LABEL: DW_TAG_subprogram
; CHECK: DW_AT_calling_convention [DW_FORM_data1] (DW_CC_LLVM_M68kRTD)
define m68k_rtdcc void @foo() !dbg !3 {
entry:
ret void
}

!llvm.dbg.cu = !{!0}
!llvm.module.flags = !{!2}

!0 = distinct !DICompileUnit(language: DW_LANG_C11, file: !1, producer: "clang version 17.0.0 (https://github.com/llvm/llvm-project.git)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false, nameTableKind: None)
!1 = !DIFile(filename: "foo.c", directory: "/path/to/file")
!2 = !{i32 2, !"Debug Info Version", i32 3}
!3 = distinct !DISubprogram(name: "foo", scope: !4, file: !4, line: 4, type: !5, scopeLine: 4, flags: DIFlagPrototyped, spFlags: DISPFlagDefinition, unit: !0, retainedNodes: !7)
!4 = !DIFile(filename: "./foo.c", directory: "/path/to/file")
!5 = !DISubroutineType(cc: DW_CC_LLVM_M68kRTD, types: !6)
!6 = !{null}
!7 = !{}
2 changes: 2 additions & 0 deletions llvm/test/DebugInfo/M68k/lit.local.cfg
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
if not "M68k" in config.root.targets:
config.unsupported = True