This enables ILASM for x-platforms.
1. Added a bunch of warning disable options mostly due to this prebuilt asmparse.cpp
2. Create a separte entry point "main" to pass WCHAR arguments.
3. PDB (CorSymWriter) part is disabled.
4. Converting/embedding resource file to binary is disabled.
5. jkotas kindly provided a code for IsTextUnicode which is unavailable on CoreCLR.
add_subdirectory(tools)
add_subdirectory(unwinder)
add_subdirectory(ildasm)
+add_subdirectory(ilasm)
if(WIN32)
- add_subdirectory(ilasm)
add_subdirectory(ipcman)
endif(WIN32)
if(WIN32)
add_subdirectory(clretwrc)
- add_subdirectory(mscorpe)
endif(WIN32)
add_subdirectory(dbgshim)
add_subdirectory(mscordbi)
add_subdirectory(mscordac)
add_subdirectory(mscoree)
+add_subdirectory(mscorpe)
add_subdirectory(mscorrc)
add_definitions(-DFEATURE_CORECLR)
set(MSCORPE_SOURCES
- ICeeFileGen.cpp
- CeeFileGenWriter.cpp
- PEWriter.cpp
- CeeFileGenWriterTokens.cpp
+ iceefilegen.cpp
+ ceefilegenwriter.cpp
+ pewriter.cpp
+ ceefilegenwritertokens.cpp
utilcodeinit.cpp
)
list(APPEND MSCORPE_SOURCES
Native.rc
)
+else()
+ add_compile_options(-Wno-delete-non-virtual-dtor)
endif(WIN32)
add_library(mscorpe STATIC
#ifdef ENC_DELTA_HACK
// for EnC we want the RVA to be right at the front of the IL stream
WCHAR szFileName[256];
- DWORD len = WszGetEnvironmentVariable(L"COMP_ENC_EMIT", szFileName, NumItems(szFileName));
+ DWORD len = WszGetEnvironmentVariable(W("COMP_ENC_EMIT"), szFileName, NumItems(szFileName));
if (len > 0)
g_EnCMode = TRUE;
#endif
hr = emitExeMain();
if (FAILED(hr))
return hr;
-
+#ifndef FEATURE_PAL
hr = emitResourceSection();
if (FAILED(hr))
return hr;
+#endif
}
m_linked = true;
HRESULT CeeFileGenWriter::generateImage(void **ppImage)
{
HRESULT hr = S_OK;
- LPWSTR outputFileName = NULL;
+ LPCWSTR outputFileName = NULL;
+#ifndef FEATURE_PAL
HANDLE hThreadToken = NULL;
// Impersonation is only supported on Win2k and above.
if (!OpenThreadToken(GetCurrentThread(), TOKEN_READ | TOKEN_IMPERSONATE, TRUE, &hThreadToken))
return HRESULT_FROM_GetLastError();
}
}
+#endif // !FEATURE_PAL
#ifdef ENC_DELTA_HACK
// fixups break because we've set the base RVA to 0 for the delta stream
if (! outputFileName && ppImage == NULL) {
if (m_comImageFlags & COMIMAGE_FLAGS_IL_LIBRARY)
- outputFileName = L"output.ill";
+ outputFileName = W("output.ill");
else if (m_dllSwitch)
- outputFileName = L"output.dll";
+ outputFileName = W("output.dll");
else if (m_objSwitch)
- outputFileName = L"output.obj";
+ outputFileName = W("output.exe");
else
- outputFileName = L"output.exe";
+ outputFileName = W("output.obj");
}
// output file name and ppImage are mutually exclusive
IfFailGo(getPEWriter().write(ppImage));
ErrExit:
+#ifndef FEATURE_PAL
if (hThreadToken != NULL)
{
BOOL success = SetThreadToken(NULL, hThreadToken);
hr = HRESULT_FROM_GetLastError();
}
}
+#endif // !FEATURE_PAL
return hr;
} // HRESULT CeeFileGenWriter::generateImage()
WCHAR wzGuid[40];
BYTE rgCA[50];
IfFailRet(emitter->DefineTypeRefByName(mdTypeRefNil, INTEROP_GUID_TYPE_W, &tr));
- IfFailRet(emitter->DefineMemberRef(tr, L".ctor", _SIG, sizeof(_SIG), &mr));
+ IfFailRet(emitter->DefineMemberRef(tr, W(".ctor"), _SIG, sizeof(_SIG), &mr));
StringFromGUID2(m_libraryGuid, wzGuid, lengthof(wzGuid));
memset(rgCA, 0, sizeof(rgCA));
// Tag is 0x0001
return CopySystemDirectory(pPath, pbuffer, cchBuffer, pdwLength);
}
-
+#ifndef FEATURE_PAL
BOOL RunProcess(LPCWSTR tempResObj, LPCWSTR pszFilename, DWORD* pdwExitCode, PEWriter &pewriter)
{
BOOL fSuccess = FALSE;
return hr;
} // HRESULT CeeFileGenWriter::emitResourceSection()
+#endif // !FEATURE_PAL
HRESULT CeeFileGenWriter::setManifestEntry(ULONG size, ULONG offset)
{
return S_OK;
}
+#ifndef _AMD64_
/* subtract two unsigned pointers yeilding a signed pointer sized int */
static inline HRESULT SubOvf_U_U(INT64 & r, UINT64 a, UINT64 b)
{
}
return E_FAIL;
}
+#endif
/******************************************************************/
for(PESectionReloc* rcur = textSection->m_relocStart; rcur < textSection->m_relocCur; rcur++)
{
- switch(rcur->type)
+ switch((int)rcur->type)
{
case 0x7FFA: // Ptr to symbol name
#ifdef _WIN64
{
IMAGE_SECTION_HEADER* phdr = textSection->m_header;
// Add to reloc table
- IMAGE_RELOC_FIELD(ir, VirtualAddress) = VAL32(rva);
+ ir.VirtualAddress = VAL32(rva);
ir.SymbolTableIndex = VAL32(i);
ir.Type = VAL16(IMAGE_REL_I386_SECREL);
if(phdr->PointerToRelocations == 0)
}
/******************************************************************/
-HRESULT PEWriter::write(__in const LPWSTR fileName) {
+HRESULT PEWriter::write(__in LPCWSTR fileName) {
HRESULT hr;
HRESULT link();
HRESULT fixup(CeeGenTokenMapper *pMapper);
- HRESULT write(__in const LPWSTR fileName);
+ HRESULT write(__in LPCWSTR fileName);
HRESULT write(void **ppImage);
// calling these functions is optional
add_definitions(-DFEATURE_CORECLR)
include_directories(.)
+include_directories(../ildasm/unixcoreclrloader)
set(ILASM_SOURCES
assem.cpp
assembler.cpp
prebuilt/asmparse.c
)
-if(WIN32)
- set_source_files_properties(prebuilt/asmparse.c PROPERTIES COMPILE_FLAGS "/TP")
-endif(WIN32)
+set_source_files_properties( prebuilt/asmparse.c PROPERTIES LANGUAGE CXX )
+
+if(CLR_CMAKE_PLATFORM_UNIX)
+ add_compile_options(-x c++)
+ # Need generate a right form of asmparse.c to avoid the following options.
+ # https://github.com/dotnet/coreclr/issues/2305
+ add_compile_options(-Wno-delete-non-virtual-dtor)
+ add_compile_options(-Wno-deprecated-register)
+ add_compile_options(-Wno-array-bounds)
+ add_compile_options(-Wno-unused-label)
+endif(CLR_CMAKE_PLATFORM_UNIX)
add_executable(ilasm
${ILASM_SOURCES}
)
set(ILASM_LINK_LIBRARIES
- mscorpe
utilcodestaticnohost
+ mscorpe
mdhotdata_full
corguids
)
if(CLR_CMAKE_PLATFORM_UNIX)
- #TODO
+ target_link_libraries(ilasm
+ ${ILASM_LINK_LIBRARIES}
+ ceefgen
+ unixcoreclrloader
+ utilcodestaticnohost
+ mscorrc_debug
+ coreclrpal
+ palrt
+ )
+
+ # FreeBSD implements dlopen in libc
+ if(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
+ target_link_libraries(ilasm
+ dl
+ )
+ endif(NOT CMAKE_SYSTEM_NAME STREQUAL FreeBSD)
+
else()
target_link_libraries(ilasm
- ${ILASM_LINK_LIBRARIES}
- coreclr
- msvcrt
- ole32
- oleaut32
- shell32
+ ${ILASM_LINK_LIBRARIES}
+ coreclr
+ msvcrt
+ ole32
+ oleaut32
+ shell32
)
install (FILES ${CMAKE_CURRENT_BINARY_DIR}/$<CONFIG>/ilasm.pdb DESTINATION PDB)
typedef struct
{
- char * pszName;
- OPCODE op;
+ const char * pszName;
+ OPCODE op;
- BYTE Type; // Inline0 etc.
+ BYTE Type; // Inline0 etc.
- BYTE Len; // std mapping
- BYTE Std1;
- BYTE Std2;
+ BYTE Len; // std mapping
+ BYTE Std1;
+ BYTE Std2;
} opcodeinfo_t;
#ifdef DECLARE_DATA
return(tmp ? tmp->tkTok : mdExportedTypeNil);
}
-AsmManAssembly* AsmMan::GetAsmRefByName(__in __nullterminated char* szAsmRefName)
+AsmManAssembly* AsmMan::GetAsmRefByName(__in __nullterminated const char* szAsmRefName)
{
AsmManAssembly* ret = NULL;
if(szAsmRefName)
}
return ret;
}
-mdToken AsmMan::GetAsmRefTokByName(__in __nullterminated char* szAsmRefName)
+mdToken AsmMan::GetAsmRefTokByName(__in __nullterminated const char* szAsmRefName)
{
AsmManAssembly* tmp = GetAsmRefByName(szAsmRefName);
return(tmp ? tmp->tkTok : mdAssemblyRefNil);
}
//==============================================================================================================
// Borrowed from VM\assembly.cpp
-
+#ifndef FEATURE_CORECLR
HRESULT GetHash(__in LPWSTR moduleName,
ALG_ID iHashAlg,
BYTE** pbCurrentValue, // should be NULL
return hr;
}
+#endif // !FEATURE_CORECLR
//==============================================================================================================
void AsmMan::AddFile(__in __nullterminated char* szName, DWORD dwAttr, BinStr* pHashBlob)
if(m_pAssembly // and assembly is defined
&& m_pAssembly->ulHashAlgorithm) // and hash algorithm is defined...
{ // then try to compute it
- if(FAILED(GetHash(wzUniBuf,(ALG_ID)(m_pAssembly->ulHashAlgorithm),&pHash,&cbHash)))
+#ifndef FEATURE_CORECLR
+ if(SUCCEEDED(GetHash(wzUniBuf,(ALG_ID)(m_pAssembly->ulHashAlgorithm),&pHash,&cbHash)))
{
- pHash = NULL;
- cbHash = 0;
+ tmp->pHash = new BinStr(pHash,cbHash);
}
else
+#else
{
- tmp->pHash = new BinStr(pHash,cbHash);
+ pHash = NULL;
+ cbHash = 0;
}
+#endif // !FEATURE_CORECLR
}
}
else
void* m_pAssembler;
AsmManFile* GetFileByName(__in __nullterminated char* szFileName);
- AsmManAssembly* GetAsmRefByName(__in __nullterminated char* szAsmRefName);
+ AsmManAssembly* GetAsmRefByName(__in __nullterminated const char* szAsmRefName);
AsmManComType* GetComTypeByName(__in_opt __nullterminated char* szComTypeName,
__in_opt __nullterminated char* szComEnclosingTypeName = NULL);
mdToken GetComTypeTokByName(__in_opt __nullterminated char* szComTypeName,
void SetManifestResAsmRef(__in __nullterminated char* szAsmRefName);
mdToken GetFileTokByName(__in __nullterminated char* szFileName);
- mdToken GetAsmRefTokByName(__in __nullterminated char* szAsmRefName);
- mdToken GetAsmTokByName(__in __nullterminated char* szAsmName)
+ mdToken GetAsmRefTokByName(__in __nullterminated const char* szAsmRefName);
+ mdToken GetAsmTokByName(__in __nullterminated const char* szAsmName)
{ return (m_pAssembly && (strcmp(m_pAssembly->szName,szAsmName)==0)) ? m_pAssembly->tkTok : 0; };
mdToken GetModuleRefTokByName(__in __nullterminated char* szName)
const WCHAR* namew()
{
- return L"local_define";
+ return W("local_define");
}
BOOL IsValid()
HANDLE hstderr;
private:
- friend void yyerror(__in __nullterminated char* str);
+ friend void yyerror(__in __nullterminated const char* str);
friend int parse_literal(unsigned curSym, __inout __nullterminated char* &curPos, BOOL translate_escapes);
friend int yyparse();
friend int yylex();
#define DECLARE_DATA
#include "assembler.h"
-#ifndef FEATURE_CORECLR
+#ifdef FEATURE_CORECLR
+#ifdef FEATURE_PAL
+#include "coreclrloader.h"
+CoreCLRLoader *g_loader;
+#endif // FEATURE_PAL
+MetaDataGetDispenserFunc metaDataGetDispenser;
+#else
#include "MscorpeSxS.h"
-#endif
+#endif // FEATURE_CORECLR
void indexKeywords(Indx* indx); // defined in asmparse.y
m_pDisp = NULL;
}
+#ifdef FEATURE_CORECLR
+#ifdef FEATURE_PAL
+ if (g_loader != NULL)
+ {
+ g_loader->Finish();
+ }
+#endif
+#else
if (m_fDidCoInitialise)
CoUninitialize();
+#endif // FEATURE_CORECLR
}
BOOL Assembler::Init()
{
+#ifdef FEATURE_CORECLR
+#ifdef FEATURE_PAL
+ g_loader = CoreCLRLoader::Create(g_pszExeFile);
+ metaDataGetDispenser = (MetaDataGetDispenserFunc)g_loader->LoadFunction("MetaDataGetDispenser");
+#else
+ metaDataGetDispenser = (MetaDataGetDispenserFunc)MetaDataGetDispenser;
+#endif // FEATURE_PAL
+#else
if(!m_fDidCoInitialise)
{
if (FAILED(CoInitializeEx(NULL, COINIT_MULTITHREADED)))
return FALSE;
m_fDidCoInitialise = TRUE;
}
+#endif // FEATURE_CORECLR
if (m_pCeeFileGen != NULL) {
if (m_pCeeFile)
m_pCeeFileGen->DestroyCeeFile(&m_pCeeFile);
if(IsMdPrivateScope(pMethod->m_Attr))
{
- WCHAR* p = wcsstr(wzMemberName,L"$PST06");
+ WCHAR* p = wcsstr(wzMemberName,W("$PST06"));
if(p) *p = 0;
}
{
mdToken tkPseudoCtor;
BYTE bSig[3] = {IMAGE_CEE_CS_CALLCONV_HASTHIS,0,ELEMENT_TYPE_VOID};
- if(FAILED(m_pEmitter->DefineMemberRef(tkPseudoClass, L".ctor", (PCCOR_SIGNATURE)bSig, 3, &tkPseudoCtor)))
+ if(FAILED(m_pEmitter->DefineMemberRef(tkPseudoClass, W(".ctor"), (PCCOR_SIGNATURE)bSig, 3, &tkPseudoCtor)))
report->error("Unable to define member reference '%s::.ctor'\n", COR_REQUIRES_SECOBJ_ATTRIBUTE_ANSI);
else DefineCV(new CustomDescr(MethodToken,tkPseudoCtor,NULL));
}
return TRUE;
}
-Class *Assembler::FindCreateClass(__in __nullterminated char *pszFQN)
+Class *Assembler::FindCreateClass(__in __nullterminated const char *pszFQN)
{
Class *pSearch = NULL;
L = wcslen(wzFullName);
if((L==0)||(wzFullName[L-1]==L'.')) // Missing class name!
{
- wcscat_s(wzFullName,dwUniBuf,L"$UNNAMED_TYPE$");
+ wcscat_s(wzFullName,dwUniBuf,W("$UNNAMED_TYPE$"));
}
pClass->m_Attr = CheckClassFlagsIfNested(pClass->m_pEncloser, pClass->m_Attr);
m_TyParList = NULL;
}
/**************************************************************************/
-mdToken Assembler::ResolveClassRef(mdToken tkResScope, __in __nullterminated char *pszFullClassName, Class** ppClass)
+mdToken Assembler::ResolveClassRef(mdToken tkResScope, __in __nullterminated const char *pszFullClassName, Class** ppClass)
{
Class *pClass = NULL;
mdToken tkRet = mdTokenNil;
mdToken token_;
public:
// Constructor for a 'lookup' object
- TypeSpecContainer(BinStr *typeSpec) :
- len_(typeSpec->length()),
- hash_(typeSpec->length()),
- token_(mdTokenNil),
- ptr_(typeSpec->ptr())
+ TypeSpecContainer(BinStr *typeSpec) :
+ ptr_(typeSpec->ptr()),
+ len_(typeSpec->length()),
+ hash_(typeSpec->length()),
+ token_(mdTokenNil)
{
for (unsigned i = 0; i < len_; i++)
hash_ = (hash_ * 257) ^ ((i + 1) * (ptr_[i] ^ 0xA5));
// Constructor for a 'permanent' object
// Don't bother re-hashing, since we will always have already constructed the lookup object
TypeSpecContainer(const TypeSpecContainer &t, mdToken tk) :
- len_(t.len_),
+ ptr_(new unsigned __int8[t.len_]),
+ len_(t.len_),
hash_(t.hash_),
- token_(tk),
- ptr_(new unsigned __int8[t.len_])
+ token_(tk)
{
_ASSERT(tk != mdTokenNil);
_ASSERT(t.token_ == mdTokenNil);
}
/**************************************************************************/
-mdToken Assembler::GetAsmRef(__in __nullterminated char* szName)
+mdToken Assembler::GetAsmRef(__in __nullterminated const char* szName)
{
mdToken tkResScope = 0;
if(strcmp(szName,"*")==0) tkResScope = mdTokenNil;
WszMultiByteToWideChar(g_uCodePage,0,pFD->m_szName,-1,wzFieldName,dwUniBuf); //int)cFieldNameLength);
if(IsFdPrivateScope(pFD->m_dwAttr))
{
- WCHAR* p = wcsstr(wzFieldName,L"$PST04");
+ WCHAR* p = wcsstr(wzFieldName,W("$PST04"));
if(p) *p = 0;
}
L = UnicodeString ? WszMultiByteToWideChar(g_uCodePage,0,(char*)pb,-1,UnicodeString,DataLen+1) : 0;
if(L == 0)
{
- char* sz=NULL;
+ const char* sz=NULL;
DWORD dw;
switch(dw=GetLastError())
{
#define NESTING_SEP ((char)0xF8)
#define dwUniBuf 16384
+
+#ifdef FEATURE_PAL
+#include "coreclrloader.h"
+extern CoreCLRLoader *g_loader;
+extern char *g_pszExeFile;
+#endif
+typedef int(*MetaDataGetDispenserFunc) (
+ REFCLSID rclsid, // The class to desired.
+ REFIID riid, // Interface wanted on class factory.
+ LPVOID FAR *ppv); // Return interface pointer here.
+
+extern MetaDataGetDispenserFunc metaDataGetDispenser;
+
extern WCHAR wzUniBuf[]; // Unicode conversion global buffer (assem.cpp)
class Class;
HRESULT CreateTLSDirectory();
HRESULT CreateDebugDirectory();
HRESULT InitMetaData();
- Class *FindCreateClass(__in __nullterminated char *pszFQN);
+ Class *FindCreateClass(__in __nullterminated const char *pszFQN);
BOOL EmitFieldRef(__in_z __in char *pszArg, int opcode);
BOOL EmitSwitchData(__in_z __in char *pszArg);
- mdToken ResolveClassRef(mdToken tkResScope, __in __nullterminated char *pszClassName, Class** ppClass);
+ mdToken ResolveClassRef(mdToken tkResScope, __in __nullterminated const char *pszClassName, Class** ppClass);
mdToken ResolveTypeSpec(BinStr* typeSpec);
mdToken GetBaseAsmRef();
- mdToken GetAsmRef(__in __nullterminated char* szName);
+ mdToken GetAsmRef(__in __nullterminated const char* szName);
mdToken GetModRef(__in __nullterminated char* szName);
mdToken GetInterfaceImpl(mdToken tsClass, mdToken tsInterface);
char* ReflectionNotation(mdToken tk);
/* Code goes here */
/********************************************************************************/
+extern int yyparse();
struct Keywords {
const char* name;
return buff;
}
-void yyerror(__in __nullterminated char* str) {
+void yyerror(__in __nullterminated const char* str) {
char tokBuff[64];
WCHAR *wzfile = (WCHAR*)(PENV->in->namew());
int iline = PENV->curLine;
#endif
/**************************************************************************/
-static char* newString(__in __nullterminated char* str1)
+static char* newString(__in __nullterminated const char* str1)
{
char* ret = new char[strlen(str1)+1];
if(ret) strcpy_s(ret, strlen(str1)+1, str1);
#endif
#define YYMAXDEPTH 0x80000
+#define YYLOCAL int
//#define YYRECURSIVE
//#define DEBUG_PARSING
#endif
static char* newStringWDel(__in __nullterminated char* str1, char delimiter, __in __nullterminated char* str3 = 0);
-static char* newString(__in __nullterminated char* str1);
+static char* newString(__in __nullterminated const char* str1);
static void corEmitInt(BinStr* buff, unsigned data);
static void AppendStringWithLength(BinStr* pbs, __in __nullterminated char* sz);
bool bParsingByteArray = FALSE;
#include "shimload.h"
#include "strsafe.h"
+#define ASSERTE_ALL_BUILDS(expr) _ASSERTE_ALL_BUILDS(__FILE__, (expr))
WCHAR* EqualOrColon(__in __nullterminated WCHAR* szArg)
{
static ULONGLONG g_stBaseAddress=0;
static size_t g_stSizeOfStackReserve=0;
extern unsigned int g_uConsoleCP;
+#ifdef FEATURE_PAL
+char * g_pszExeFile;
+#endif
void MakeTestFile(__in __nullterminated char* szFileName)
{
if(wzProperName[j] == '.') break;
if((wzProperName[j] == '\\')||(j == 0))
{
- wcscat_s(wzProperName,MAX_FILENAME_LENGTH,L".il");
+ wcscat_s(wzProperName,MAX_FILENAME_LENGTH,W(".il"));
break;
}
}
#pragma warning(push)
#pragma warning(disable:21000) // Suppress PREFast warning about overly large function
#endif
+
extern "C" int _cdecl wmain(int argc, __in WCHAR **argv)
{
int i, NumFiles = 0, NumDeltaFiles = 0;
#pragma warning(push)
#pragma warning(disable:26000) // "Suppress prefast warning about index overflow"
#endif
- if (! wcscmp(argv[1], L"/?") || ! wcscmp(argv[1],L"-?"))
+ if (! wcscmp(argv[1], W("/?")) || ! wcscmp(argv[1],W("-?")))
#ifdef _PREFAST_
#pragma warning(pop)
#endif
}
uCodePage = CP_UTF8;
- WszSetEnvironmentVariable(L"COMP_ENC_OPENSCOPE", L"");
- WszSetEnvironmentVariable(L"COMP_ENC_EMIT", L"");
+ WszSetEnvironmentVariable(W("COMP_ENC_OPENSCOPE"), W(""));
+ WszSetEnvironmentVariable(W("COMP_ENC_EMIT"), W(""));
if((pAsm = new Assembler()))
{
pAsm->SetCodePage(uCodePage);
//-------------------------------------------------
for (i = 1; i < argc; i++)
{
+#ifdef FEATURE_PAL
+ if(argv[i][0] == L'-')
+#else
if((argv[i][0] == L'/') || (argv[i][0] == L'-'))
+#endif
{
memset(szOpt,0,sizeof(szOpt));
WszWideCharToMultiByte(uCodePage,0,&argv[i][1],-1,szOpt,sizeof(szOpt),NULL,NULL);
else if (!_stricmp(szOpt, "DEB"))
{
pAsm->m_dwIncludeDebugInfo = 0x101;
+#ifdef FEATURE_CORECLR
+ printf("Warning: PDB is ignored under 'DEB' option for ilasm on CoreCLR.\n");
+#else
pAsm->m_fGeneratePDB = TRUE;
+#endif
bNoDebug = FALSE;
WCHAR *pStr = EqualOrColon(argv[i]);
WCHAR wzSubOpt[8];
wcsncpy_s(wzSubOpt,8,pStr,3);
wzSubOpt[3] = 0;
- if(0 == _wcsicmp(wzSubOpt,L"OPT"))
+ if(0 == _wcsicmp(wzSubOpt,W("OPT")))
pAsm->m_dwIncludeDebugInfo = 0x3;
- else if(0 == _wcsicmp(wzSubOpt,L"IMP"))
+ else if(0 == _wcsicmp(wzSubOpt,W("IMP")))
pAsm->m_dwIncludeDebugInfo = 0x103;
else
{
- WCHAR *pFmt =((*pStr == '0')&&(*(pStr+1) == 'x'))? L"%lx" : L"%ld";
+ const WCHAR *pFmt =((*pStr == '0')&&(*(pStr+1) == 'x'))? W("%lx") : W("%ld");
if(swscanf_s(pStr,pFmt,&(pAsm->m_dwIncludeDebugInfo))!=1)
goto InvalidOption; // bad subooption
}
}
else if (!_stricmp(szOpt, "PDB"))
{
+#ifdef FEATURE_CORECLR
+ printf("Warning: 'PDB' option is ignored for ilasm on CoreCLR.\n");
+#else
pAsm->m_fGeneratePDB = TRUE;
+#endif
bNoDebug = FALSE;
}
else if (!_stricmp(szOpt, "CLO"))
if(wcslen(pStr)==0) goto InvalidOption; //if no version
{
int major=-1,minor=-1;
- if(swscanf_s(pStr,L"%d.%d",&major, &minor)==2)
+ if(swscanf_s(pStr,W("%d.%d"),&major, &minor)==2)
{
if((major >= 0)&&(major < 0xFF))
pAsm->m_wMSVmajor = (WORD)major;
WCHAR *pStr = EqualOrColon(argv[i]);
if(pStr == NULL) goto InvalidOption;
pStr++;
- WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? L"%lx" : L"%ld";
+ const WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? W("%lx") : W("%ld");
if(swscanf_s(pStr,pFmt,&g_dwSubsystem)!=1) goto InvalidOption;
}
else if (!_stricmp(szOpt, "SSV"))
if(wcslen(pStr)==0) goto InvalidOption; //if no version
{
int major=-1,minor=-1;
- if(swscanf_s(pStr,L"%d.%d",&major, &minor)==2)
+ if(swscanf_s(pStr,W("%d.%d"),&major, &minor)==2)
{
if((major >= 0)&&(major < 0xFFFF))
pAsm->m_wSSVersionMajor = (WORD)major;
WCHAR *pStr = EqualOrColon(argv[i]);
if(pStr == NULL) goto InvalidOption;
pStr++;
- WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? L"%lx" : L"%ld";
+ const WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? W("%lx") : W("%ld");
if(swscanf_s(pStr,pFmt,&g_dwFileAlignment)!=1) goto InvalidOption;
if((g_dwFileAlignment & (g_dwFileAlignment-1))
|| (g_dwFileAlignment < 0x200) || (g_dwFileAlignment > 0x10000))
WCHAR *pStr = EqualOrColon(argv[i]);
if(pStr == NULL) goto InvalidOption;
pStr++;
- WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? L"%lx" : L"%ld";
+ const WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? W("%lx") : W("%ld");
if(swscanf_s(pStr,pFmt,&g_dwComImageFlags)!=1) goto InvalidOption;
}
else if (!_stricmp(szOpt, "BAS"))
WCHAR *pStr = EqualOrColon(argv[i]);
if(pStr == NULL) goto InvalidOption;
pStr++;
- WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? L"%I64x" : L"%I64d";
+ const WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? W("%I64x") : W("%I64d");
if(swscanf_s(pStr,pFmt,&g_stBaseAddress)!=1) goto InvalidOption;
if(g_stBaseAddress & 0xFFFF)
{
WCHAR *pStr = EqualOrColon(argv[i]);
if(pStr == NULL) goto InvalidOption;
pStr++;
- WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? L"%lx" : L"%ld";
+ const WCHAR *pFmt = ((*pStr=='0')&&(*(pStr+1) == 'x'))? W("%lx") : W("%ld");
if(swscanf_s(pStr,pFmt,&g_stSizeOfStackReserve)!=1) goto InvalidOption;
}
#ifdef _SPECIAL_INTERNAL_USE_ONLY
}
}
while(j);
- wcscat_s(wzOutputFilename, MAX_FILENAME_LENGTH,(IsDLL ? L".dll" : (IsOBJ ? L".obj" : L".exe")));
+ wcscat_s(wzOutputFilename, MAX_FILENAME_LENGTH,(IsDLL ? W(".dll") : (IsOBJ ? W(".obj") : W(".exe"))));
}
if(wzIncludePath == NULL)
{
- if(0!=WszGetEnvironmentVariable(L"ILASM_INCLUDE",wzIncludePathBuffer,MAX_FILENAME_LENGTH))
+ if(0!=WszGetEnvironmentVariable(W("ILASM_INCLUDE"),wzIncludePathBuffer,MAX_FILENAME_LENGTH))
wzIncludePath = wzIncludePathBuffer;
}
//------------ Assembler initialization done. Now, to business -----------------------
}
else
{
+#ifndef FEATURE_PAL
DWORD dwBinType;
if(GetBinaryTypeA(szInputFilename,&dwBinType))
{
fAllFilesPresent = FALSE;
}
else
+#endif
{
pAsm->SetSourceFileName(FullFileName(wzInputFilename,uCodePage)); // deletes the argument!
{
wcscpy_s(wzNewOutputFilename,MAX_FILENAME_LENGTH+16,wzOutputFilename);
exitval = (int)StringCchPrintfW(&wzNewOutputFilename[wcslen(wzNewOutputFilename)], 32,
- L".%d",iFile+1);
+ W(".%d"),iFile+1);
MakeProperSourceFileName(pwzDeltaFiles[iFile], uCodePage, wzInputFilename, szInputFilename);
if(pAsm->m_fReportProgress)
{
}
else
{
+#ifndef FEATURE_PAL
DWORD dwBinType;
if(GetBinaryTypeA(szInputFilename,&dwBinType))
{
fAllFilesPresent = FALSE;
}
else
+#endif
if (SUCCEEDED(pAsm->InitMetaDataForENC(wzNewOutputFilename)))
{
pAsm->SetSourceFileName(FullFileName(wzInputFilename,uCodePage)); // deletes the argument!
}
else printf("Insufficient memory\n");
- WszSetEnvironmentVariable(L"COMP_ENC_OPENSCOPE", L"");
- WszSetEnvironmentVariable(L"COMP_ENC_EMIT", L"");
+ WszSetEnvironmentVariable(W("COMP_ENC_OPENSCOPE"), W(""));
+ WszSetEnvironmentVariable(W("COMP_ENC_EMIT"), W(""));
if(exitval || bNoDebug)
{
pc = &wzOutputFilename[wcslen(wzOutputFilename)];
*pc = L'.';
}
- wcscpy_s(pc+1,4,L"PDB");
+ wcscpy_s(pc+1,4,W("PDB"));
#undef DeleteFileW
DeleteFileW(wzOutputFilename);
}
#pragma warning(pop)
#endif
-
+#ifndef FEATURE_CORECLR
HINSTANCE GetModuleInst()
{
return (NULL);
}
+#endif // !FEATURE_CORECLR
+#ifdef FEATURE_PAL
+int main(int argc, char* str[])
+{
+ g_pszExeFile = str[0];
+ if (0 != PAL_Initialize(argc, str))
+ {
+ fprintf(stderr,"Error: Fail to PAL_Initialize\n");
+ exit(1);
+ }
+
+ WCHAR **argv = new WCHAR*[argc];
+ for (int i = 0; i < argc; i++) {
+ int length = MultiByteToWideChar(CP_ACP, 0, str[i], -1, NULL, 0);
+ ASSERTE_ALL_BUILDS(length != 0);
+ LPWSTR result = new (nothrow) WCHAR[length];
+ ASSERTE_ALL_BUILDS(result != NULL);
+
+ length = MultiByteToWideChar(CP_ACP, 0, str[i], -1, result, length);
+ ASSERTE_ALL_BUILDS (length != 0);
+
+ argv[i] = result;
+ }
+
+ int ret = wmain(argc, argv);
+
+ for (int i = 0 ; i < argc; i++) {
+ delete[] argv[i];
+ }
+ delete[] argv;
+
+ return ret;
+}
+#endif // FEATURE_PAL
if(bClock) bClock->cMDInitBegin = GetTickCount();
#ifdef FEATURE_CORECLR
- hr = MetaDataGetDispenser(CLSID_CorMetaDataDispenser,
+ hr = metaDataGetDispenser(CLSID_CorMetaDataDispenser,
IID_IMetaDataDispenserEx, (void **)&m_pDisp);
#else
hr = LegacyActivationShim::ClrCoCreateInstance(
if(FAILED(hr = m_pEmitter->QueryInterface(IID_IMetaDataImport2, (void**)&m_pImporter)))
goto exit;
+#ifndef FEATURE_CORECLR
hr = CoCreateInstance(CLSID_CorSymWriter_SxS,
NULL,
CLSCTX_INPROC_SERVER,
fprintf(stderr, "Error: QueryInterface(IID_ISymUnmanagedWriter) returns %X\n",hr);
m_pSymWriter = NULL;
}
+#endif // !FEATURE_CORECLR
//m_Parser = new AsmParse(m_pEmitter);
m_fInitialisedMetaData = TRUE;
HRESULT Assembler::CreateDebugDirectory()
{
HRESULT hr = S_OK;
+ HCEESECTION sec = m_pILSection;
+ BYTE *de;
+ ULONG deOffset;
// Only emit this if we're also emitting debug info.
if (!(m_fGeneratePDB && m_pSymWriter))
// Note that UpdateResource doesn't work correctly if the debug directory is
// in the data section. So instead we put it in the text section (same as
// cs compiler).
- HCEESECTION sec = m_pILSection;//m_pGlobalDataSection;
- BYTE *de;
-
if (FAILED(hr = m_pCeeFileGen->GetSectionBlock(sec,
sizeof(debugDirIDD) +
param.debugDirDataSize,
goto ErrExit;
// Where did we get that memory?
- ULONG deOffset;
if (FAILED(hr = m_pCeeFileGen->GetSectionDataLen(sec,
&deOffset)))
goto ErrExit;
if(IsMdPrivateScope(pListMD->m_Attr))
{
- WCHAR* p = wcsstr(wzUniBuf,L"$PST06");
+ WCHAR* p = wcsstr(wzUniBuf,W("$PST06"));
if(p) *p = 0;
}
if(m_wzResourceFile)
{
+#ifdef FEATURE_PAL
+ report->msg("Warning: The Win32 resource file '%S' is ignored and not emitted on xPlatform.\n", m_wzResourceFile);
+#else
if (FAILED(hr=m_pCeeFileGen->SetResourceFileName(m_pCeeFile, m_wzResourceFile)))
{
report->msg("Warning: failed to set Win32 resource file name '%S', hr=0x%8.8X\n The Win32 resource is not emitted.\n",
m_wzResourceFile, hr);
}
+#endif
}
if (FAILED(hr=CreateTLSDirectory())) goto exit;
if(!Init()) goto exit; // close and re-open CeeFileGen and CeeFile
hr = S_OK;
+#ifndef FEATURE_CORECLR
hr = CoCreateInstance(CLSID_CorSymWriter_SxS,
NULL,
CLSCTX_INPROC_SERVER,
if(SUCCEEDED(hr))
{
WCHAR* pwc = &wzOrigFileName[wcslen(wzOrigFileName)];
- wcscat_s(wzOrigFileName,MAX_SCOPE_LENGTH,L".pdb");
+ wcscat_s(wzOrigFileName,MAX_SCOPE_LENGTH,W(".pdb"));
if(m_pSymWriter) m_pSymWriter->Initialize((IUnknown*)m_pEmitter,
wzOrigFileName,
NULL,
fprintf(stderr, "Error: CoCreateInstance(IID_ISymUnmanagedWriter) returns %X\n",hr);
m_pSymWriter = NULL;
}
-
+#endif
exit:
return hr;
Class* pClass;
Method* pMethod;
FILE* pF = NULL;
- wcscat_s(pwzOutputFilename,MAX_SCOPE_LENGTH,L".dil");
- if(_wfopen_s(&pF,pwzOutputFilename,L"wb")==0)
+ wcscat_s(pwzOutputFilename,MAX_SCOPE_LENGTH,W(".dil"));
+ if(_wfopen_s(&pF,pwzOutputFilename,W("wb"))==0)
{
int i,j,L=0,M=0;
BinStr bsOut;
DWORD metaDataSize;
if (FAILED(hr=pENCEmitter->GetDeltaSaveSize(cssAccurate, &metaDataSize))) goto exit;
- wcscat_s(pwzOutputFilename,MAX_SCOPE_LENGTH,L".dmeta");
+ wcscat_s(pwzOutputFilename,MAX_SCOPE_LENGTH,W(".dmeta"));
pENCEmitter->SaveDelta(pwzOutputFilename,0); // second arg (dwFlags) is not used
*pEnd = 0;
pENCEmitter->Release();
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
+#ifndef CORECLRLOADER_H
+#define CORECLRLOADER_H
typedef int (*InitializeCoreCLRFunction)(
const char* exePath,
const char* appDomainFriendlyName,
void* LoadFunction(const char* functionName);
int Finish();
};
+#endif // CORECLRLOADER_H
// slot on the caller's stack.
//
-#define COR_REQUIRES_SECOBJ_ATTRIBUTE L"System.Security.DynamicSecurityMethodAttribute"
+#define COR_REQUIRES_SECOBJ_ATTRIBUTE W("System.Security.DynamicSecurityMethodAttribute")
#define COR_REQUIRES_SECOBJ_ATTRIBUTE_ANSI "System.Security.DynamicSecurityMethodAttribute"
#define COR_COMPILERSERVICE_DISCARDABLEATTRIBUTE L"System.Runtime.CompilerServices.DiscardableAttribute"
#define INTEROP_COMIMPORT_TYPE "System.Runtime.InteropServices.ComImportAttribute"
#define INTEROP_COMIMPORT_SIG {IMAGE_CEE_CS_CALLCONV_DEFAULT_HASTHIS, 0, ELEMENT_TYPE_VOID}
-#define INTEROP_GUID_TYPE_W L"System.Runtime.InteropServices.GuidAttribute"
+#define INTEROP_GUID_TYPE_W W("System.Runtime.InteropServices.GuidAttribute")
#define INTEROP_GUID_TYPE "System.Runtime.InteropServices.GuidAttribute"
#define INTEROP_GUID_SIG {IMAGE_CEE_CS_CALLCONV_DEFAULT_HASTHIS, 1, ELEMENT_TYPE_VOID, ELEMENT_TYPE_STRING}
// IMAGE_LIBRARY_PROCESS_TERM 0x0002 // Reserved.
// IMAGE_LIBRARY_THREAD_INIT 0x0004 // Reserved.
// IMAGE_LIBRARY_THREAD_TERM 0x0008 // Reserved.
+#define IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA 0x0020 // Image can handle a high entropy 64-bit virtual address space.
#define IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE 0x0040 // DLL can move
#define IMAGE_DLLCHARACTERISTICS_NX_COMPAT 0x0100 // Image ix NX compatible
#define IMAGE_DLLCHARACTERISTICS_NO_SEH 0x0400 // Image does not use SEH. No SE handler may reside in this image
union {
ULONG VirtualAddress;
ULONG RelocCount; // Set to the real count when IMAGE_SCN_LNK_NRELOC_OVFL is set
- } u;
+ };
ULONG SymbolTableIndex;
USHORT Type;
} IMAGE_RELOCATION;
#define IS_TEXT_UNICODE_SIGNATURE 0x0008
#define IS_TEXT_UNICODE_UNICODE_MASK 0x000F
+BOOL IsTextUnicode(CONST VOID* lpv, int iSize, LPINT lpiResult);
+
typedef struct _LIST_ENTRY {
struct _LIST_ENTRY *Flink;
struct _LIST_ENTRY *Blink;
memorystream.cpp
path.cpp
urlpars.cpp
+ unicode.cpp
variant.cpp
)
--- /dev/null
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+//
+
+#include "common.h"
+
+// This is a simplified implementation of IsTextUnicode.
+// https://github.com/dotnet/coreclr/issues/2307
+BOOL IsTextUnicode(CONST VOID* lpv, int iSize, LPINT lpiResult)
+{
+ *lpiResult = 0;
+
+ if (iSize < 2) return FALSE;
+
+ BYTE * p = (BYTE *)lpv;
+
+ // Check for Unicode BOM
+ if ((*p == 0xFF) && (*(p+1) == 0xFE))
+ {
+ *lpiResult |= IS_TEXT_UNICODE_SIGNATURE;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+