diff --git a/CMakeLists.txt b/CMakeLists.txt
index 10a831c28..ec339b037 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -58,6 +58,18 @@ if(MSVC)
add_definitions( "/wd4819" )
endif()
+SET(DFHACK_BUILD_ARCH "32" CACHE STRING "Architecture to build ('32' or '64')")
+IF("${DFHACK_BUILD_ARCH}" STREQUAL "32")
+ SET(DFHACK_BUILD_32 1)
+ SET(DFHACK_BUILD_64 0)
+ELSEIF("${DFHACK_BUILD_ARCH}" STREQUAL "64")
+ SET(DFHACK_BUILD_32 0)
+ SET(DFHACK_BUILD_64 1)
+ ADD_DEFINITIONS(-DDFHACK64)
+ELSE()
+ MESSAGE(SEND_ERROR "Invalid build architecture (should be 32/64): ${DFHACK_BUILD_ARCH}")
+ENDIF()
+
IF(CMAKE_CROSSCOMPILING)
SET(DFHACK_NATIVE_BUILD_DIR "DFHACK_NATIVE_BUILD_DIR-NOTFOUND" CACHE FILEPATH "Path to a native build directory")
INCLUDE("${DFHACK_NATIVE_BUILD_DIR}/ImportExecutables.cmake")
@@ -152,8 +164,15 @@ IF(UNIX)
# enable C++11 features
add_definitions(-DLINUX_BUILD)
SET(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -g -Wall -Wno-unused-variable")
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -m32 -march=i686 -mtune=generic -std=c++0x")
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -m32 -march=i686 -mtune=generic")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden -mtune=generic -std=c++0x")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fvisibility=hidden -mtune=generic")
+ IF(DFHACK_BUILD_64)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -mno-avx")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64 -mno-avx")
+ ELSE()
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32 -march=i686")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32 -march=i686")
+ ENDIF()
ELSEIF(MSVC)
# for msvc, tell it to always use 8-byte pointers to member functions to avoid confusion
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /vmg /vmm /MP")
diff --git a/depends/lua/CMakeLists.txt b/depends/lua/CMakeLists.txt
index b77bce6f7..782bb5e96 100644
--- a/depends/lua/CMakeLists.txt
+++ b/depends/lua/CMakeLists.txt
@@ -11,8 +11,12 @@ ELSE()
ENDIF()
IF(UNIX)
- add_definitions(-DLINUX_BUILD)
- SET(CMAKE_C_FLAGS "-m32")
+ ADD_DEFINITIONS(-DLINUX_BUILD)
+ IF(DFHACK_BUILD_64)
+ SET(CMAKE_C_FLAGS "-m64 -mno-avx")
+ ELSE()
+ SET(CMAKE_C_FLAGS "-m32")
+ ENDIF()
ENDIF()
SET (HDR_LIBLUA
diff --git a/library/ColorText.cpp b/library/ColorText.cpp
index 359b717e6..7f417e0a8 100644
--- a/library/ColorText.cpp
+++ b/library/ColorText.cpp
@@ -126,10 +126,18 @@ void color_ostream::vprinterr(const char *format, va_list args)
color_value save = cur_color;
if (log_errors_to_stderr)
- vfprintf(stderr, format, args);
+ {
+ va_list args1;
+ va_copy(args1, args);
+ vfprintf(stderr, format, args1);
+ va_end(args1);
+ }
color(COLOR_LIGHTRED);
- vprint(format, args);
+ va_list args2;
+ va_copy(args2, args);
+ vprint(format, args2);
+ va_end(args2);
color(save);
}
diff --git a/library/DataDefs.cpp b/library/DataDefs.cpp
index f9187ff09..be381d860 100644
--- a/library/DataDefs.cpp
+++ b/library/DataDefs.cpp
@@ -276,11 +276,11 @@ virtual_identity *virtual_identity::find(void *vtable)
if (p->vtable_ptr && p->vtable_ptr != vtable) {
std::cerr << "Conflicting vtable ptr for class '" << p->getName()
- << "': found 0x" << std::hex << unsigned(vtable)
- << ", previous 0x" << unsigned(p->vtable_ptr) << std::dec << std::endl;
+ << "': found 0x" << std::hex << uintptr_t(vtable)
+ << ", previous 0x" << uintptr_t(p->vtable_ptr) << std::dec << std::endl;
abort();
} else if (!p->vtable_ptr) {
- uint32_t pv = unsigned(vtable);
+ uintptr_t pv = uintptr_t(vtable);
pv -= Core::getInstance().vinfo->getRebaseDelta();
std::cerr << "" << std::endl;
@@ -292,7 +292,7 @@ virtual_identity *virtual_identity::find(void *vtable)
}
std::cerr << "UNKNOWN CLASS '" << name << "': vtable = 0x"
- << std::hex << unsigned(vtable) << std::dec << std::endl;
+ << std::hex << uintptr_t(vtable) << std::dec << std::endl;
known[vtable] = NULL;
return NULL;
diff --git a/library/DataStaticsFields.cpp b/library/DataStaticsFields.cpp
index 583e4d6a4..96f91dd66 100644
--- a/library/DataStaticsFields.cpp
+++ b/library/DataStaticsFields.cpp
@@ -30,6 +30,8 @@ namespace df {
NUMBER_IDENTITY_TRAITS(uint32_t);
NUMBER_IDENTITY_TRAITS(int64_t);
NUMBER_IDENTITY_TRAITS(uint64_t);
+ NUMBER_IDENTITY_TRAITS(intptr_t);
+ NUMBER_IDENTITY_TRAITS(uintptr_t);
NUMBER_IDENTITY_TRAITS(float);
NUMBER_IDENTITY_TRAITS(double);
diff --git a/library/LuaApi.cpp b/library/LuaApi.cpp
index 712ccb541..74019c4e1 100644
--- a/library/LuaApi.cpp
+++ b/library/LuaApi.cpp
@@ -2310,8 +2310,8 @@ static void *checkaddr(lua_State *L, int idx, bool allow_null = false)
return rv;
}
-static uint32_t getImageBase() { return Core::getInstance().p->getBase(); }
-static int getRebaseDelta() { return Core::getInstance().vinfo->getRebaseDelta(); }
+static uintptr_t getImageBase() { return Core::getInstance().p->getBase(); }
+static intptr_t getRebaseDelta() { return Core::getInstance().vinfo->getRebaseDelta(); }
static int8_t getModstate() { return Core::getInstance().getModstate(); }
static std::string internal_strerror(int n) { return strerror(n); }
@@ -2344,7 +2344,7 @@ static int internal_getPE(lua_State *L)
static int internal_getAddress(lua_State *L)
{
const char *name = luaL_checkstring(L, 1);
- uint32_t addr = Core::getInstance().vinfo->getAddress(name);
+ uintptr_t addr = Core::getInstance().vinfo->getAddress(name);
if (addr)
lua_pushnumber(L, addr);
else
@@ -2355,7 +2355,7 @@ static int internal_getAddress(lua_State *L)
static int internal_setAddress(lua_State *L)
{
std::string name = luaL_checkstring(L, 1);
- uint32_t addr = (uint32_t)checkaddr(L, 2, true);
+ uintptr_t addr = (uintptr_t)checkaddr(L, 2, true);
internal_getAddress(L);
// Set the address
@@ -2372,7 +2372,7 @@ static int internal_setAddress(lua_State *L)
}
// Print via printerr, so that it is definitely logged to stderr.log.
- uint32_t iaddr = addr - Core::getInstance().vinfo->getRebaseDelta();
+ uintptr_t iaddr = addr - Core::getInstance().vinfo->getRebaseDelta();
fprintf(stderr, "Setting global '%s' to %x (%x)\n", name.c_str(), addr, iaddr);
fflush(stderr);
@@ -2382,7 +2382,7 @@ static int internal_setAddress(lua_State *L)
static int internal_getVTable(lua_State *L)
{
const char *name = luaL_checkstring(L, 1);
- uint32_t addr = (uint32_t)Core::getInstance().vinfo->getVTable(name);
+ uintptr_t addr = (uintptr_t)Core::getInstance().vinfo->getVTable(name);
if (addr)
lua_pushnumber(L, addr);
else
@@ -2412,9 +2412,9 @@ static int internal_getMemRanges(lua_State *L)
for(size_t i = 0; i < ranges.size(); i++)
{
lua_newtable(L);
- lua_pushnumber(L, (uint32_t)ranges[i].start);
+ lua_pushnumber(L, (uintptr_t)ranges[i].start);
lua_setfield(L, -2, "start_addr");
- lua_pushnumber(L, (uint32_t)ranges[i].end);
+ lua_pushnumber(L, (uintptr_t)ranges[i].end);
lua_setfield(L, -2, "end_addr");
lua_pushstring(L, ranges[i].name);
lua_setfield(L, -2, "name");
diff --git a/library/LuaWrapper.cpp b/library/LuaWrapper.cpp
index dac458709..08af93e78 100644
--- a/library/LuaWrapper.cpp
+++ b/library/LuaWrapper.cpp
@@ -993,7 +993,7 @@ static int meta_ptr_tostring(lua_State *state)
lua_getfield(state, UPVAL_METATABLE, "__metatable");
const char *cname = lua_tostring(state, -1);
- lua_pushstring(state, stl_sprintf("<%s: 0x%08x>", cname, (unsigned)ptr).c_str());
+ lua_pushstring(state, stl_sprintf("<%s: 0x%08x>", cname, (uintptr_t)ptr).c_str());
return 1;
}
diff --git a/library/Process-darwin.cpp b/library/Process-darwin.cpp
index 6f159e5fe..95c347368 100644
--- a/library/Process-darwin.cpp
+++ b/library/Process-darwin.cpp
@@ -118,8 +118,8 @@ Process::~Process()
string Process::doReadClassName (void * vptr)
{
//FIXME: BAD!!!!!
- char * typeinfo = Process::readPtr(((char *)vptr - 0x4));
- char * typestring = Process::readPtr(typeinfo + 0x4);
+ char * typeinfo = Process::readPtr(((char *)vptr - sizeof(void*)));
+ char * typestring = Process::readPtr(typeinfo + sizeof(void*));
string raw = readCString(typestring);
size_t start = raw.find_first_of("abcdefghijklmnopqrstuvwxyz");// trim numbers
size_t end = raw.length();
@@ -151,9 +151,15 @@ void Process::getMemRanges( vector & ranges )
the_task = mach_task_self();
+#ifdef DFHACK64
+ mach_vm_size_t vmsize;
+ mach_vm_address_t address;
+ vm_region_basic_info_data_64_t info;
+#else
vm_size_t vmsize;
vm_address_t address;
vm_region_basic_info_data_t info;
+#endif
mach_msg_type_number_t info_count;
vm_region_flavor_t flavor;
memory_object_name_t object;
@@ -162,10 +168,18 @@ void Process::getMemRanges( vector & ranges )
address = 0;
do {
+#ifdef DFHACK64
+ flavor = VM_REGION_BASIC_INFO_64;
+ info_count = VM_REGION_BASIC_INFO_COUNT_64;
+ kr = mach_vm_region(the_task, &address, &vmsize, flavor,
+ (vm_region_info_64_t)&info, &info_count, &object);
+#else
flavor = VM_REGION_BASIC_INFO;
info_count = VM_REGION_BASIC_INFO_COUNT;
kr = vm_region(the_task, &address, &vmsize, flavor,
(vm_region_info_t)&info, &info_count, &object);
+#endif
+
if (kr == KERN_SUCCESS) {
if (info.reserved==1) {
address += vmsize;
diff --git a/library/Process-linux.cpp b/library/Process-linux.cpp
index 1a1e754d0..14c70a802 100644
--- a/library/Process-linux.cpp
+++ b/library/Process-linux.cpp
@@ -122,8 +122,8 @@ Process::~Process()
string Process::doReadClassName (void * vptr)
{
//FIXME: BAD!!!!!
- char * typeinfo = Process::readPtr(((char *)vptr - 0x4));
- char * typestring = Process::readPtr(typeinfo + 0x4);
+ char * typeinfo = Process::readPtr(((char *)vptr - sizeof(void*)));
+ char * typestring = Process::readPtr(typeinfo + sizeof(void*));
string raw = readCString(typestring);
size_t start = raw.find_first_of("abcdefghijklmnopqrstuvwxyz");// trim numbers
size_t end = raw.length();
diff --git a/library/VTableInterpose.cpp b/library/VTableInterpose.cpp
index eb8dec861..d81c6d730 100644
--- a/library/VTableInterpose.cpp
+++ b/library/VTableInterpose.cpp
@@ -305,7 +305,7 @@ VMethodInterposeLinkBase::VMethodInterposeLinkBase(virtual_identity *host, int v
*/
fprintf(stderr, "Bad VMethodInterposeLinkBase arguments: %d %08x (%s)\n",
- vmethod_idx, unsigned(interpose_method), name_str);
+ vmethod_idx, uintptr_t(interpose_method), name_str);
fflush(stderr);
abort();
}
diff --git a/library/VersionInfoFactory.cpp b/library/VersionInfoFactory.cpp
index f6bd5cba9..02dac568c 100644
--- a/library/VersionInfoFactory.cpp
+++ b/library/VersionInfoFactory.cpp
@@ -69,7 +69,7 @@ VersionInfo * VersionInfoFactory::getVersionInfoByMD5(string hash)
return 0;
}
-VersionInfo * VersionInfoFactory::getVersionInfoByPETimestamp(uint32_t timestamp)
+VersionInfo * VersionInfoFactory::getVersionInfoByPETimestamp(uintptr_t timestamp)
{
for(size_t i = 0; i < versions.size();i++)
{
@@ -140,7 +140,7 @@ void VersionInfoFactory::ParseVersion (TiXmlElement* entry, VersionInfo* mem)
}
if ((is_vtable && no_vtables) || (!is_vtable && no_globals))
continue;
- uint32_t addr = strtol(cstr_value, 0, 0);
+ uintptr_t addr = strtol(cstr_value, 0, 0);
if (is_vtable)
mem->setVTable(cstr_key, addr);
else
diff --git a/library/include/DataIdentity.h b/library/include/DataIdentity.h
index e6dfc6a18..c94129f9b 100644
--- a/library/include/DataIdentity.h
+++ b/library/include/DataIdentity.h
@@ -487,6 +487,8 @@ namespace df
NUMBER_IDENTITY_TRAITS(uint32_t);
NUMBER_IDENTITY_TRAITS(int64_t);
NUMBER_IDENTITY_TRAITS(uint64_t);
+ NUMBER_IDENTITY_TRAITS(intptr_t);
+ NUMBER_IDENTITY_TRAITS(uintptr_t);
NUMBER_IDENTITY_TRAITS(float);
NUMBER_IDENTITY_TRAITS(double);
diff --git a/library/include/VersionInfo.h b/library/include/VersionInfo.h
index cf7dd60c0..58ecb2c28 100644
--- a/library/include/VersionInfo.h
+++ b/library/include/VersionInfo.h
@@ -49,10 +49,10 @@ namespace DFHack
{
private:
std::vector md5_list;
- std::vector PE_list;
- std::map Addresses;
- std::map VTables;
- uint32_t base;
+ std::vector PE_list;
+ std::map Addresses;
+ std::map VTables;
+ uintptr_t base;
int rebase_delta;
std::string version;
OSType OS;
@@ -75,10 +75,10 @@ namespace DFHack
OS = rhs.OS;
};
- uint32_t getBase () const { return base; };
+ uintptr_t getBase () const { return base; };
int getRebaseDelta() const { return rebase_delta; }
- void setBase (const uint32_t _base) { base = _base; };
- void rebaseTo(const uint32_t new_base)
+ void setBase (const uintptr_t _base) { base = _base; };
+ void rebaseTo(const uintptr_t new_base)
{
int64_t old = base;
int64_t newx = new_base;
@@ -100,11 +100,11 @@ namespace DFHack
return std::find(md5_list.begin(), md5_list.end(), _md5) != md5_list.end();
};
- void addPE (uint32_t PE_)
+ void addPE (uintptr_t PE_)
{
PE_list.push_back(PE_);
};
- bool hasPE (uint32_t PE_) const
+ bool hasPE (uintptr_t PE_) const
{
return std::find(PE_list.begin(), PE_list.end(), PE_) != PE_list.end();
};
@@ -115,7 +115,7 @@ namespace DFHack
};
std::string getVersion() const { return version; };
- void setAddress (const std::string& key, const uint32_t value)
+ void setAddress (const std::string& key, const uintptr_t value)
{
Addresses[key] = value;
};
@@ -129,7 +129,7 @@ namespace DFHack
return true;
};
- uint32_t getAddress (const std::string& key) const
+ uintptr_t getAddress (const std::string& key) const
{
auto i = Addresses.find(key);
if(i == Addresses.end())
@@ -137,7 +137,7 @@ namespace DFHack
return (*i).second;
}
- void setVTable (const std::string& key, const uint32_t value)
+ void setVTable (const std::string& key, const uintptr_t value)
{
VTables[key] = value;
};
diff --git a/library/include/VersionInfoFactory.h b/library/include/VersionInfoFactory.h
index f69f37fee..8a2cabdc3 100644
--- a/library/include/VersionInfoFactory.h
+++ b/library/include/VersionInfoFactory.h
@@ -40,7 +40,7 @@ namespace DFHack
bool loadFile( std::string path_to_xml);
bool isInErrorState() const {return error;};
VersionInfo * getVersionInfoByMD5(std::string md5string);
- VersionInfo * getVersionInfoByPETimestamp(uint32_t timestamp);
+ VersionInfo * getVersionInfoByPETimestamp(uintptr_t timestamp);
std::vector versions;
// trash existing list
void clear();
diff --git a/library/include/modules/EventManager.h b/library/include/modules/EventManager.h
index 6e4be47be..d22fa2310 100644
--- a/library/include/modules/EventManager.h
+++ b/library/include/modules/EventManager.h
@@ -116,7 +116,7 @@ namespace std {
std::size_t operator()(const DFHack::EventManager::EventHandler& h) const {
size_t r = 17;
const size_t m = 65537;
- r = m*(r+(int32_t)h.eventHandler);
+ r = m*(r+(intptr_t)h.eventHandler);
r = m*(r+h.freq);
return r;
}
diff --git a/library/modules/Buildings.cpp b/library/modules/Buildings.cpp
index a6589bac1..d819d358c 100644
--- a/library/modules/Buildings.cpp
+++ b/library/modules/Buildings.cpp
@@ -1173,52 +1173,52 @@ void Buildings::clearBuildings(color_ostream& out) {
void Buildings::updateBuildings(color_ostream& out, void* ptr)
{
- int32_t id = (int32_t)ptr;
- auto building = df::building::find(id);
-
- if (building)
- {
- // Already cached -> weird, so bail out
- if (corner1.count(id))
- return;
- // Civzones cannot be cached because they can
- // overlap each other and normal buildings.
- if (!building->isSettingOccupancy())
- return;
-
- df::coord p1(min(building->x1, building->x2), min(building->y1,building->y2), building->z);
- df::coord p2(max(building->x1, building->x2), max(building->y1,building->y2), building->z);
-
- corner1[id] = p1;
- corner2[id] = p2;
-
- for ( int32_t x = p1.x; x <= p2.x; x++ ) {
- for ( int32_t y = p1.y; y <= p2.y; y++ ) {
- df::coord pt(x,y,building->z);
- if (containsTile(building, pt, false))
- locationToBuilding[pt] = id;
- }
- }
- }
- else if (corner1.count(id))
- {
- //existing building: destroy it
- df::coord p1 = corner1[id];
- df::coord p2 = corner2[id];
-
- for ( int32_t x = p1.x; x <= p2.x; x++ ) {
- for ( int32_t y = p1.y; y <= p2.y; y++ ) {
- df::coord pt(x,y,p1.z);
-
- auto cur = locationToBuilding.find(pt);
- if (cur != locationToBuilding.end() && cur->second == id)
- locationToBuilding.erase(cur);
- }
- }
-
- corner1.erase(id);
- corner2.erase(id);
- }
+ // int32_t id = (int32_t)ptr;
+ // auto building = df::building::find(id);
+
+ // if (building)
+ // {
+ // // Already cached -> weird, so bail out
+ // if (corner1.count(id))
+ // return;
+ // // Civzones cannot be cached because they can
+ // // overlap each other and normal buildings.
+ // if (!building->isSettingOccupancy())
+ // return;
+
+ // df::coord p1(min(building->x1, building->x2), min(building->y1,building->y2), building->z);
+ // df::coord p2(max(building->x1, building->x2), max(building->y1,building->y2), building->z);
+
+ // corner1[id] = p1;
+ // corner2[id] = p2;
+
+ // for ( int32_t x = p1.x; x <= p2.x; x++ ) {
+ // for ( int32_t y = p1.y; y <= p2.y; y++ ) {
+ // df::coord pt(x,y,building->z);
+ // if (containsTile(building, pt, false))
+ // locationToBuilding[pt] = id;
+ // }
+ // }
+ // }
+ // else if (corner1.count(id))
+ // {
+ // //existing building: destroy it
+ // df::coord p1 = corner1[id];
+ // df::coord p2 = corner2[id];
+
+ // for ( int32_t x = p1.x; x <= p2.x; x++ ) {
+ // for ( int32_t y = p1.y; y <= p2.y; y++ ) {
+ // df::coord pt(x,y,p1.z);
+
+ // auto cur = locationToBuilding.find(pt);
+ // if (cur != locationToBuilding.end() && cur->second == id)
+ // locationToBuilding.erase(cur);
+ // }
+ // }
+
+ // corner1.erase(id);
+ // corner2.erase(id);
+ // }
}
void Buildings::getStockpileContents(df::building_stockpilest *stockpile, std::vector *items)
diff --git a/plugins/Plugins.cmake b/plugins/Plugins.cmake
index c801570db..4871c1f0c 100644
--- a/plugins/Plugins.cmake
+++ b/plugins/Plugins.cmake
@@ -1,8 +1,15 @@
IF(UNIX)
- add_definitions(-DLINUX_BUILD)
- SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
- SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -m32 -std=c++0x")
- SET(CMAKE_C_FLAGS "-fvisibility=hidden -m32")
+ add_definitions(-DLINUX_BUILD)
+ SET(CMAKE_CXX_FLAGS_DEBUG "-g -Wall")
+ SET(CMAKE_CXX_FLAGS "-fvisibility=hidden -std=c++0x")
+ SET(CMAKE_C_FLAGS "-fvisibility=hidden")
+ IF(DFHACK_BUILD_64)
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64 -mno-avx")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m64 -mno-avx")
+ ELSE()
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m32")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -m32")
+ ENDIF()
ENDIF()
include_directories("${dfhack_SOURCE_DIR}/library/include")