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 } {****************************************************************************}