From 646385e966f69bad8bb767bc442b6f7bf5482c94 Mon Sep 17 00:00:00 2001
From: Jonas Maebe <jonas@freepascal.org>
Date: Wed, 9 Nov 2016 19:51:27 +0000
Subject: [PATCH]   * support for overriding the line ending character in
 external assembler     writer decorators (for LLVM function-level inline
 assembly: there     newline has to be replaced by the character sequence
 '\0A')

git-svn-id: trunk@34854 -
---
 compiler/assemble.pas    | 24 +++++++++++++++---------
 compiler/llvm/agllvm.pas |  7 +++++++
 2 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/compiler/assemble.pas b/compiler/assemble.pas
index 227d32e100..370fc46fa0 100644
--- a/compiler/assemble.pas
+++ b/compiler/assemble.pas
@@ -68,6 +68,7 @@ interface
         function LinePrefix: AnsiString;
         function LinePostfix: AnsiString;
         function LineFilter(const s: AnsiString): AnsiString;
+        function LineEnding(const deflineending: ShortString): ShortString;
       end;
 
       TExternalAssemblerOutputFile=class
@@ -569,23 +570,28 @@ Implementation
     Procedure TExternalAssemblerOutputFile.AsmLn;
       var
         newline: pshortstring;
+        newlineres: shortstring;
+        index: longint;
       begin
         MaybeAddLinePostfix;
-        if OutCnt>=AsmOutSize-2 then
-         AsmFlush;
         if (cs_link_on_target in current_settings.globalswitches) then
           newline:=@target_info.newline
         else
           newline:=@source_info.newline;
-        OutBuf[OutCnt]:=newline^[1];
-        inc(OutCnt);
-        inc(AsmSize);
-        if length(newline^)>1 then
+        if assigned(decorator) then
           begin
-            OutBuf[OutCnt]:=newline^[2];
-            inc(OutCnt);
-            inc(AsmSize);
+            newlineres:=decorator.LineEnding(newline^);
+            newline:=@newlineres;
           end;
+        if OutCnt>=AsmOutSize-length(newline^) then
+         AsmFlush;
+        index:=1;
+        repeat
+          OutBuf[OutCnt]:=newline^[index];
+          inc(OutCnt);
+          inc(AsmSize);
+          inc(index);
+        until index>length(newline^);
       end;
 
 
diff --git a/compiler/llvm/agllvm.pas b/compiler/llvm/agllvm.pas
index f8778f1d9e..baa7635dfb 100644
--- a/compiler/llvm/agllvm.pas
+++ b/compiler/llvm/agllvm.pas
@@ -37,6 +37,7 @@ interface
        function LinePrefix: AnsiString;
        function LinePostfix: AnsiString;
        function LineFilter(const s: AnsiString): AnsiString;
+       function LineEnding(const deflineending: ShortString): ShortString;
       end;
 
       TLLVMAssember=class(texternalassembler)
@@ -176,6 +177,12 @@ implementation
       end;
 
 
+    function TLLVMModuleInlineAssemblyDecorator.LineEnding(const deflineending: ShortString): ShortString;
+      begin
+        result:=deflineending
+      end;
+
+
  {****************************************************************************}
  {                        LLVM Instruction writer                             }
  {****************************************************************************}