Commit 29defd705d

Andrew Kelley <superjoe30@gmail.com>
2017-04-30 17:28:11
back to AT&T syntax for assembly
this reverts 5c04730534ea7933855429c5fc5dc7b22eba7bc2. sadly the quality of the intel dialect in llvm's assembly parser has many frustrating bugs, and generally has unfortunate syntax. the plan is to use AT&T for now since it at least works, and eventually zig will have its own assembly parser for x86 and it will be as close to NASM as possible.
1 parent cbfe4b4
src/codegen.cpp
@@ -2088,10 +2088,9 @@ static LLVMValueRef ir_render_asm(CodeGen *g, IrExecutable *executable, IrInstru
     }
     LLVMTypeRef function_type = LLVMFunctionType(ret_type, param_types, (unsigned)input_and_output_count, false);
 
-    bool is_x86 = (g->zig_target.arch.arch == ZigLLVM_x86 || g->zig_target.arch.arch == ZigLLVM_x86_64);
     bool is_volatile = asm_expr->is_volatile || (asm_expr->output_list.length == 0);
-    LLVMValueRef asm_fn = ZigLLVMConstInlineAsm(function_type, buf_ptr(&llvm_template),
-            buf_ptr(&constraint_buf), is_volatile, false, is_x86);
+    LLVMValueRef asm_fn = LLVMConstInlineAsm(function_type, buf_ptr(&llvm_template),
+            buf_ptr(&constraint_buf), is_volatile, false);
 
     return LLVMBuildCall(g->builder, asm_fn, param_values, (unsigned)input_and_output_count, "");
 }
@@ -4805,9 +4804,6 @@ static void gen_global_asm(CodeGen *g) {
         if ((err = os_fetch_file_path(asm_file, &contents))) {
             zig_panic("Unable to read %s: %s", buf_ptr(asm_file), err_str(err));
         }
-        if (g->zig_target.arch.arch == ZigLLVM_x86 || g->zig_target.arch.arch == ZigLLVM_x86_64) {
-            buf_append_str(&g->global_asm, ".intel_syntax noprefix\n");
-        }
         buf_append_buf(&g->global_asm, &contents);
     }
 }
src/zig_llvm.cpp
@@ -186,18 +186,6 @@ LLVMValueRef ZigLLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *A
     return wrap(unwrap(B)->Insert(call_inst));
 }
 
-LLVMValueRef ZigLLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
-        const char *Constraints, bool HasSideEffects, bool IsAlignStack, bool is_x86)
-{
-    if (is_x86) {
-        return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
-                                Constraints, HasSideEffects, IsAlignStack, InlineAsm::AD_Intel));
-    } else {
-        return wrap(InlineAsm::get(dyn_cast<FunctionType>(unwrap(Ty)), AsmString,
-                                Constraints, HasSideEffects, IsAlignStack));
-    }
-}
-
 void ZigLLVMFnSetSubprogram(LLVMValueRef fn, ZigLLVMDISubprogram *subprogram) {
     assert( isa<Function>(unwrap(fn)) );
     Function *unwrapped_function = reinterpret_cast<Function*>(unwrap(fn));
src/zig_llvm.hpp
@@ -40,9 +40,6 @@ bool ZigLLVMTargetMachineEmitToFile(LLVMTargetMachineRef targ_machine_ref, LLVMM
 LLVMValueRef ZigLLVMBuildCall(LLVMBuilderRef B, LLVMValueRef Fn, LLVMValueRef *Args,
         unsigned NumArgs, unsigned CC, bool always_inline, const char *Name);
 
-LLVMValueRef ZigLLVMConstInlineAsm(LLVMTypeRef Ty, const char *AsmString,
-        const char *Constraints, bool HasSideEffects, bool IsAlignStack, bool is_x86);
-
 LLVMValueRef ZigLLVMBuildCmpXchg(LLVMBuilderRef builder, LLVMValueRef ptr, LLVMValueRef cmp,
         LLVMValueRef new_val, LLVMAtomicOrdering success_ordering,
         LLVMAtomicOrdering failure_ordering);
std/os/linux_i386.zig
@@ -420,20 +420,20 @@ pub const F_GETOWN_EX = 16;
 pub const F_GETOWNER_UIDS = 17;
 
 pub inline fn syscall0(number: usize) -> usize {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number))
 }
 
 pub inline fn syscall1(number: usize, arg1: usize) -> usize {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number),
             [arg1] "{ebx}" (arg1))
 }
 
 pub inline fn syscall2(number: usize, arg1: usize, arg2: usize) -> usize {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number),
             [arg1] "{ebx}" (arg1),
@@ -441,7 +441,7 @@ pub inline fn syscall2(number: usize, arg1: usize, arg2: usize) -> usize {
 }
 
 pub inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) -> usize {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number),
             [arg1] "{ebx}" (arg1),
@@ -450,7 +450,7 @@ pub inline fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) ->
 }
 
 pub inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg4: usize) -> usize {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number),
             [arg1] "{ebx}" (arg1),
@@ -462,7 +462,7 @@ pub inline fn syscall4(number: usize, arg1: usize, arg2: usize, arg3: usize, arg
 pub inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,
     arg4: usize, arg5: usize) -> usize
 {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number),
             [arg1] "{ebx}" (arg1),
@@ -475,7 +475,7 @@ pub inline fn syscall5(number: usize, arg1: usize, arg2: usize, arg3: usize,
 pub inline fn syscall6(number: usize, arg1: usize, arg2: usize, arg3: usize,
     arg4: usize, arg5: usize, arg6: usize) -> usize
 {
-    asm volatile ("int 80h"
+    asm volatile ("int $0x80"
         : [ret] "={eax}" (-> usize)
         : [number] "{eax}" (number),
             [arg1] "{ebx}" (arg1),
std/special/bootstrap.zig
@@ -19,10 +19,10 @@ export nakedcc fn _start() -> noreturn {
 
     switch (@compileVar("arch")) {
         Arch.x86_64 => {
-            argc_ptr = asm("lea %[argc], [rsp]": [argc] "=r" (-> &usize));
+            argc_ptr = asm("lea (%%rsp), %[argc]": [argc] "=r" (-> &usize));
         },
         Arch.i386 => {
-            argc_ptr = asm("lea %[argc], [esp]": [argc] "=r" (-> &usize));
+            argc_ptr = asm("lea (%%esp), %[argc]": [argc] "=r" (-> &usize));
         },
         else => @compileError("unsupported arch"),
     }
test/assemble_and_link.zig
@@ -7,18 +7,17 @@ pub fn addCases(cases: &tests.CompareOutputContext) {
             \\.globl _start
             \\
             \\_start:
-            \\    mov rax, 1
-            \\    mov rdi, 1
-            \\    lea rsi, msg
-            \\    mov rdx, 14
+            \\    mov $1, %rax
+            \\    mov $1, %rdi
+            \\    mov $msg, %rsi
+            \\    mov $14, %rdx
             \\    syscall
             \\
-            \\    mov rax, 60
-            \\    mov rdi, 0
+            \\    mov $60, %rax
+            \\    mov $0, %rdi
             \\    syscall
             \\
             \\.data
-            \\
             \\msg:
             \\    .ascii "Hello, world!\n"
         , "Hello, world!\n");