| // REQUIRES: x86-registered-target |
| // RUN: %clang_cc1 -triple x86_64 %s -S -o /dev/null -Werror -verify |
| // RUN: %clang_cc1 -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s |
| |
| struct string_view { |
| int S; |
| const char* D; |
| constexpr string_view() : S(0), D(0){} |
| constexpr string_view(const char* Str) : S(__builtin_strlen(Str)), D(Str) {} |
| constexpr string_view(int Size, const char* Str) : S(Size), D(Str) {} |
| constexpr int size() const { |
| return S; |
| } |
| constexpr const char* data() const { |
| return D; |
| } |
| }; |
| |
| namespace GH143242 { |
| constexpr string_view code2 = R"(nop; nop; nop; nop)"; |
| asm((code2)); |
| // CHECK: module asm "nop; nop; nop; nop" |
| } |
| |
| int func() {return 0;}; |
| |
| void f() { |
| |
| asm((string_view("")) ::(string_view("r"))(func())); |
| // CHECK: %[[CALL:.*]] = call noundef i32 @_Z4funcv |
| // CHECK: call void asm sideeffect "", "r,~{dirflag},~{fpsr},~{flags}" |
| asm("" :::(string_view("memory"))); |
| // CHECK: call void asm sideeffect "", "~{memory},~{dirflag},~{fpsr},~{flags}" |
| } |
| |
| void foo(unsigned long long addr, unsigned long long a0) { |
| register unsigned long long result asm("rax"); |
| register unsigned long long b0 asm("rdi"); |
| |
| b0 = a0; |
| |
| asm((string_view("call *%1")) : (string_view("=r")) (result) |
| : (string_view("r"))(addr), (string_view("r")) (b0) : (string_view("memory"))); |
| |
| // CHECK:{{.*}} call i64 asm "call *$1", "={rax},r,{rdi},~{memory},~{dirflag},~{fpsr},~{flags}" |
| } |
| |
| |
| void test_srcloc() { |
| asm((string_view( // expected-error {{invalid instruction mnemonic 'nonsense'}} \ |
| // expected-error {{invalid instruction mnemonic 'foobar'}} \ |
| // expected-note@1 {{instantiated into assembly here}} \ |
| // expected-note@2 {{instantiated into assembly here}} |
| R"o(nonsense |
| foobar)o") |
| |
| ) ::(string_view("r"))(func())); |
| } |